Mob inventory cleanup

This commit is contained in:
Kelenius
2016-03-15 16:39:40 +03:00
parent 5104957ff8
commit afbc235b96
59 changed files with 432 additions and 390 deletions

View File

@@ -406,7 +406,7 @@ datum/gas_mixture/proc/check_recombustability(list/fuel_objs)
//Get heat transfer coefficients for clothing. //Get heat transfer coefficients for clothing.
for(var/obj/item/clothing/C in src) for(var/obj/item/clothing/C in src)
if(l_hand == C || r_hand == C) if(item_is_in_hands(C))
continue continue
if( C.max_heat_protection_temperature >= last_temperature ) if( C.max_heat_protection_temperature >= last_temperature )

View File

@@ -94,10 +94,7 @@
if(W == A) // Handle attack_self if(W == A) // Handle attack_self
W.attack_self(src) W.attack_self(src)
if(hand) update_inv_active_hand(0)
update_inv_l_hand(0)
else
update_inv_r_hand(0)
return 1 return 1
//Atoms on your person //Atoms on your person

View File

@@ -162,7 +162,7 @@
inv_box.name = "r_hand" inv_box.name = "r_hand"
inv_box.icon = ui_style inv_box.icon = ui_style
inv_box.icon_state = "r_hand_inactive" inv_box.icon_state = "r_hand_inactive"
if(mymob && !mymob.hand) //This being 0 or null means the right hand is in use if(!target.hand) //This being 0 or null means the right hand is in use
inv_box.icon_state = "r_hand_active" inv_box.icon_state = "r_hand_active"
inv_box.screen_loc = ui_rhand inv_box.screen_loc = ui_rhand
inv_box.slot_id = slot_r_hand inv_box.slot_id = slot_r_hand
@@ -177,7 +177,7 @@
inv_box.name = "l_hand" inv_box.name = "l_hand"
inv_box.icon = ui_style inv_box.icon = ui_style
inv_box.icon_state = "l_hand_inactive" inv_box.icon_state = "l_hand_inactive"
if(mymob && mymob.hand) //This being 1 means the left hand is in use if(target.hand) //This being 1 means the left hand is in use
inv_box.icon_state = "l_hand_active" inv_box.icon_state = "l_hand_active"
inv_box.screen_loc = ui_lhand inv_box.screen_loc = ui_lhand
inv_box.slot_id = slot_l_hand inv_box.slot_id = slot_l_hand

View File

@@ -76,7 +76,7 @@
P.info = "The nuclear authorization code is: <b>[code]</b>" P.info = "The nuclear authorization code is: <b>[code]</b>"
P.name = "nuclear bomb code" P.name = "nuclear bomb code"
if(leader && leader.current) if(leader && leader.current)
if(get_turf(P) == get_turf(leader.current) && !(leader.current.l_hand && leader.current.r_hand)) if(get_turf(P) == get_turf(leader.current))
leader.current.put_in_hands(P) leader.current.put_in_hands(P)
if(!code_owner && leader) if(!code_owner && leader)

View File

@@ -50,8 +50,7 @@ var/datum/antagonist/renegade/renegades
var/gun_type = pick(spawn_guns) var/gun_type = pick(spawn_guns)
var/obj/item/gun = new gun_type(get_turf(player)) var/obj/item/gun = new gun_type(get_turf(player))
if(!(player.l_hand && player.r_hand)) player.put_in_hands(gun)
player.put_in_hands(gun)
/proc/rightandwrong() /proc/rightandwrong()

View File

@@ -244,7 +244,7 @@
var/mob/living/carbon/human/M = src var/mob/living/carbon/human/M = src
if(M.l_hand && M.r_hand) //Make sure our hands aren't full. if(M.hands_are_full()) //Make sure our hands aren't full.
src << "<span class='warning'>Our hands are full. Drop something first.</span>" src << "<span class='warning'>Our hands are full. Drop something first.</span>"
return 0 return 0

View File

@@ -55,7 +55,7 @@
..() ..()
/obj/item/weapon/melee/arm_blade/process() //Stolen from ninja swords. /obj/item/weapon/melee/arm_blade/process() //Stolen from ninja swords.
if(!creator || loc != creator || (creator.l_hand != src && creator.r_hand != src)) if(!creator || loc != creator || !creator.item_is_in_hands(src))
// Tidy up a bit. // Tidy up a bit.
if(istype(loc,/mob/living)) if(istype(loc,/mob/living))
var/mob/living/carbon/human/host = loc var/mob/living/carbon/human/host = loc

View File

@@ -73,13 +73,10 @@
/obj/item/equipped() /obj/item/equipped()
..() ..()
var/mob/M = loc var/mob/living/M = loc
if(!istype(M)) if(!istype(M))
return return
if(M.l_hand) M.update_held_icons()
M.l_hand.update_held_icon()
if(M.r_hand)
M.r_hand.update_held_icon()
/obj/item/Destroy() /obj/item/Destroy()
if(ismob(loc)) if(ismob(loc))
@@ -95,8 +92,8 @@
//Checks if the item is being held by a mob, and if so, updates the held icons //Checks if the item is being held by a mob, and if so, updates the held icons
/obj/item/proc/update_held_icon() /obj/item/proc/update_held_icon()
if(ismob(src.loc)) if(isliving(src.loc))
var/mob/M = src.loc var/mob/living/M = src.loc
if(M.l_hand == src) if(M.l_hand == src)
M.update_inv_l_hand() M.update_inv_l_hand()
else if(M.r_hand == src) else if(M.r_hand == src)
@@ -157,7 +154,7 @@
size = "huge" size = "huge"
return ..(user, distance, "", "It is a [size] item.") return ..(user, distance, "", "It is a [size] item.")
/obj/item/attack_hand(mob/user as mob) /obj/item/attack_hand(mob/living/user as mob)
if (!user) return if (!user) return
if (hasorgans(user)) if (hasorgans(user))
var/mob/living/carbon/human/H = user var/mob/living/carbon/human/H = user
@@ -396,17 +393,15 @@ var/list/global/slot_flags_enumeration = list(
if((!istype(usr, /mob/living/carbon)) || (istype(usr, /mob/living/carbon/brain)))//Is humanoid, and is not a brain if((!istype(usr, /mob/living/carbon)) || (istype(usr, /mob/living/carbon/brain)))//Is humanoid, and is not a brain
usr << "<span class='warning'>You can't pick things up!</span>" usr << "<span class='warning'>You can't pick things up!</span>"
return return
var/mob/living/carbon/C = usr
if( usr.stat || usr.restrained() )//Is not asleep/dead and is not restrained if( usr.stat || usr.restrained() )//Is not asleep/dead and is not restrained
usr << "<span class='warning'>You can't pick things up!</span>" usr << "<span class='warning'>You can't pick things up!</span>"
return return
if(src.anchored) //Object isn't anchored if(src.anchored) //Object isn't anchored
usr << "<span class='warning'>You can't pick that up!</span>" usr << "<span class='warning'>You can't pick that up!</span>"
return return
if(!usr.hand && usr.r_hand) //Right hand is not full if(C.get_active_hand()) //Hand is not full
usr << "<span class='warning'>Your right hand is full.</span>" usr << "<span class='warning'>Your hand is full.</span>"
return
if(usr.hand && usr.l_hand) //Left hand is not full
usr << "<span class='warning'>Your left hand is full.</span>"
return return
if(!istype(src.loc, /turf)) //Object is on a turf if(!istype(src.loc, /turf)) //Object is on a turf
usr << "<span class='warning'>You can't pick that up!</span>" usr << "<span class='warning'>You can't pick that up!</span>"

View File

@@ -12,7 +12,7 @@
var/code = 2 var/code = 2
/obj/item/device/radio/electropack/attack_hand(mob/user as mob) /obj/item/device/radio/electropack/attack_hand(mob/living/user as mob)
if(src == user.back) if(src == user.back)
user << "<span class='notice'>You need help taking this off!</span>" user << "<span class='notice'>You need help taking this off!</span>"
return return

View File

@@ -209,7 +209,7 @@
amount = 5 amount = 5
max_amount = 5 max_amount = 5
/obj/item/stack/medical/splint/attack(mob/living/carbon/M as mob, mob/user as mob) /obj/item/stack/medical/splint/attack(mob/living/carbon/M as mob, mob/living/user as mob)
if(..()) if(..())
return 1 return 1

View File

@@ -160,20 +160,7 @@
P.icon_state = "paper_words" P.icon_state = "paper_words"
if(istype(usr,/mob/living/carbon)) if(istype(usr,/mob/living/carbon))
// place the item in the usr's hand if possible usr.put_in_hands(src)
if(!usr.r_hand)
P.loc = usr
usr.r_hand = P
P.layer = 20
else if(!usr.l_hand)
P.loc = usr
usr.l_hand = P
P.layer = 20
if (ismob(src.loc))
var/mob/M = src.loc
M.update_inv_l_hand()
M.update_inv_r_hand()
/obj/item/weapon/autopsy_scanner/attack(mob/living/carbon/human/M as mob, mob/living/carbon/user as mob) /obj/item/weapon/autopsy_scanner/attack(mob/living/carbon/human/M as mob, mob/living/carbon/user as mob)
if(!istype(M)) if(!istype(M))

View File

@@ -445,39 +445,36 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/weapon/flame/lighter/attack_self(mob/living/user) /obj/item/weapon/flame/lighter/attack_self(mob/living/user)
if(!base_state) if(!base_state)
base_state = icon_state base_state = icon_state
if(user.r_hand == src || user.l_hand == src) if(!lit)
if(!lit) lit = 1
lit = 1 icon_state = "[base_state]on"
icon_state = "[base_state]on" item_state = "[base_state]on"
item_state = "[base_state]on" if(istype(src, /obj/item/weapon/flame/lighter/zippo) )
if(istype(src, /obj/item/weapon/flame/lighter/zippo) ) user.visible_message("<span class='rose'>Without even breaking stride, [user] flips open and lights [src] in one smooth movement.</span>")
user.visible_message("<span class='rose'>Without even breaking stride, [user] flips open and lights [src] in one smooth movement.</span>")
else
if(prob(95))
user.visible_message("<span class='notice'>After a few attempts, [user] manages to light the [src].</span>")
else
user << "<span class='warning'>You burn yourself while lighting the lighter.</span>"
if (user.l_hand == src)
user.apply_damage(2,BURN,"l_hand")
else
user.apply_damage(2,BURN,"r_hand")
user.visible_message("<span class='notice'>After a few attempts, [user] manages to light the [src], they however burn their finger in the process.</span>")
set_light(2)
processing_objects.Add(src)
else else
lit = 0 if(prob(95))
icon_state = "[base_state]" user.visible_message("<span class='notice'>After a few attempts, [user] manages to light the [src].</span>")
item_state = "[base_state]"
if(istype(src, /obj/item/weapon/flame/lighter/zippo) )
user.visible_message("<span class='rose'>You hear a quiet click, as [user] shuts off [src] without even looking at what they're doing.</span>")
else else
user.visible_message("<span class='notice'>[user] quietly shuts off the [src].</span>") user << "<span class='warning'>You burn yourself while lighting the lighter.</span>"
if (user.get_left_hand() == src)
user.apply_damage(2,BURN,"l_hand")
else
user.apply_damage(2,BURN,"r_hand")
user.visible_message("<span class='notice'>After a few attempts, [user] manages to light the [src], they however burn their finger in the process.</span>")
set_light(0) set_light(2)
processing_objects.Remove(src) processing_objects.Add(src)
else else
return ..() lit = 0
icon_state = "[base_state]"
item_state = "[base_state]"
if(istype(src, /obj/item/weapon/flame/lighter/zippo) )
user.visible_message("<span class='rose'>You hear a quiet click, as [user] shuts off [src] without even looking at what they're doing.</span>")
else
user.visible_message("<span class='notice'>[user] quietly shuts off the [src].</span>")
set_light(0)
processing_objects.Remove(src)
return return

View File

@@ -77,7 +77,5 @@
icon_state = "purplecomb" icon_state = "purplecomb"
item_state = "purplecomb" item_state = "purplecomb"
/obj/item/weapon/haircomb/attack_self(mob/user) /obj/item/weapon/haircomb/attack_self(mob/living/user)
if(user.r_hand == src || user.l_hand == src) user.visible_message(text("<span class='notice'>[] uses [] to comb their hair with incredible style and sophistication. What a [].</span>", user, src, user.gender == FEMALE ? "lady" : "guy"))
user.visible_message(text("<span class='notice'>[] uses [] to comb their hair with incredible style and sophistication. What a [].</span>", user, src, user.gender == FEMALE ? "lady" : "guy"))
return

View File

@@ -39,8 +39,8 @@
return null return null
var/turf/location = loc var/turf/location = loc
if(istype(location, /mob/)) if(istype(location, /mob/))
var/mob/M = location var/mob/living/M = location
if(M.l_hand == src || M.r_hand == src) if(M.item_is_in_hands(src))
location = M.loc location = M.loc
if(isturf(location)) //start a fire if possible if(isturf(location)) //start a fire if possible
location.hotspot_expose(700, 2) location.hotspot_expose(700, 2)

View File

@@ -125,12 +125,12 @@
icon_state = "wrap_paper" icon_state = "wrap_paper"
var/amount = 20.0 var/amount = 20.0
/obj/item/weapon/wrapping_paper/attackby(obj/item/weapon/W as obj, mob/user as mob) /obj/item/weapon/wrapping_paper/attackby(obj/item/weapon/W as obj, mob/living/user as mob)
..() ..()
if (!( locate(/obj/structure/table, src.loc) )) if (!( locate(/obj/structure/table, src.loc) ))
user << "<span class='warning'>You MUST put the paper on a table!</span>" user << "<span class='warning'>You MUST put the paper on a table!</span>"
if (W.w_class < 4) if (W.w_class < 4)
if ((istype(user.l_hand, /obj/item/weapon/wirecutters) || istype(user.r_hand, /obj/item/weapon/wirecutters))) if (user.get_type_in_hands(/obj/item/weapon/wirecutters))
var/a_used = 2 ** (src.w_class - 1) var/a_used = 2 ** (src.w_class - 1)
if (src.amount < a_used) if (src.amount < a_used)
user << "<span class='warning'>You need more paper!</span>" user << "<span class='warning'>You need more paper!</span>"

View File

@@ -24,8 +24,8 @@
return return
attack_hand(mob/user as mob) attack_hand(mob/living/user as mob)
if ((src.case && (user.l_hand == src || user.r_hand == src))) if ((src.case && user.item_is_in_hands(src)))
user.put_in_active_hand(case) user.put_in_active_hand(case)
src.case.add_fingerprint(user) src.case.add_fingerprint(user)

View File

@@ -29,7 +29,7 @@
/obj/item/weapon/material/twohanded/update_held_icon() /obj/item/weapon/material/twohanded/update_held_icon()
var/mob/living/M = loc var/mob/living/M = loc
if(istype(M) && !issmall(M) && ((M.r_hand == src && !M.l_hand) || (M.l_hand == src && !M.r_hand))) if(istype(M) && !issmall(M) && M.item_is_in_hands(src) && !M.hands_are_full())
wielded = 1 wielded = 1
force = force_wielded force = force_wielded
name = "[base_name] (wielded)" name = "[base_name] (wielded)"

View File

@@ -214,7 +214,7 @@
spawn(1) if(src) qdel(src) spawn(1) if(src) qdel(src)
/obj/item/weapon/melee/energy/blade/process() /obj/item/weapon/melee/energy/blade/process()
if(!creator || loc != creator || (creator.l_hand != src && creator.r_hand != src)) if(!creator || loc != creator || !creator.item_is_in_hands(src))
// Tidy up a bit. // Tidy up a bit.
if(istype(loc,/mob/living)) if(istype(loc,/mob/living))
var/mob/living/carbon/human/host = loc var/mob/living/carbon/human/host = loc

View File

@@ -59,7 +59,7 @@
spawn(1) if(src) del(src) spawn(1) if(src) del(src)
/obj/item/weapon/mop_deploy/process() /obj/item/weapon/mop_deploy/process()
if(!creator || loc != creator || (creator.l_hand != src && creator.r_hand != src)) if(!creator || loc != creator || !creator.item_is_in_hands(src))
// Tidy up a bit. // Tidy up a bit.
if(istype(loc,/mob/living)) if(istype(loc,/mob/living))
var/mob/living/carbon/human/host = loc var/mob/living/carbon/human/host = loc

View File

@@ -21,7 +21,7 @@
var/linked var/linked
/obj/item/weapon/storage/laundry_basket/attack_hand(mob/user as mob) /obj/item/weapon/storage/laundry_basket/attack_hand(mob/living/user as mob)
if(ishuman(user)) if(ishuman(user))
var/mob/living/carbon/human/H = user var/mob/living/carbon/human/H = user
var/obj/item/organ/external/temp = H.get_organ("r_hand") var/obj/item/organ/external/temp = H.get_organ("r_hand")

View File

@@ -173,7 +173,7 @@
user << text("\icon[] [] contains []/[] units of fuel!", src, src.name, get_fuel(),src.max_fuel ) user << text("\icon[] [] contains []/[] units of fuel!", src, src.name, get_fuel(),src.max_fuel )
/obj/item/weapon/weldingtool/attackby(obj/item/W as obj, mob/user as mob) /obj/item/weapon/weldingtool/attackby(obj/item/W as obj, mob/living/user as mob)
if(istype(W,/obj/item/weapon/screwdriver)) if(istype(W,/obj/item/weapon/screwdriver))
if(welding) if(welding)
user << "<span class='danger'>Stop welding first!</span>" user << "<span class='danger'>Stop welding first!</span>"
@@ -222,9 +222,9 @@
//I'm not sure what this does. I assume it has to do with starting fires... //I'm not sure what this does. I assume it has to do with starting fires...
//...but it doesnt check to see if the welder is on or not. //...but it doesnt check to see if the welder is on or not.
var/turf/location = src.loc var/turf/location = src.loc
if(istype(location, /mob/)) if(istype(location, /mob/living))
var/mob/M = location var/mob/living/M = location
if(M.l_hand == src || M.r_hand == src) if(M.item_is_in_hands(src))
location = get_turf(M) location = get_turf(M)
if (istype(location, /turf)) if (istype(location, /turf))
location.hotspot_expose(700, 5) location.hotspot_expose(700, 5)

View File

@@ -93,11 +93,12 @@
// check for TK users // check for TK users
if (istype(usr, /mob/living/carbon/human)) if (istype(usr, /mob/living/carbon/human))
if(istype(usr.l_hand, /obj/item/tk_grab) || istype(usr.r_hand, /obj/item/tk_grab/)) var/mob/living/carbon/human/H = usr
if(!(usr in nearby)) if(H.get_type_in_hands(/obj/item/tk_grab))
if(usr.client && usr.machine==src) if(!(H in nearby))
if(H.client && H.machine==src)
is_in_use = 1 is_in_use = 1
src.attack_hand(usr) src.attack_hand(H)
in_use = is_in_use in_use = is_in_use
/obj/proc/updateDialog() /obj/proc/updateDialog()

View File

@@ -28,7 +28,7 @@
update_icon() update_icon()
/obj/structure/extinguisher_cabinet/attack_hand(mob/user) /obj/structure/extinguisher_cabinet/attack_hand(mob/living/user)
if(isrobot(user)) if(isrobot(user))
return return
if (ishuman(user)) if (ishuman(user))

View File

@@ -213,10 +213,10 @@
..() ..()
/obj/structure/bed/chair/janicart/relaymove(mob/user, direction) /obj/structure/bed/chair/janicart/relaymove(mob/living/user, direction)
if(user.stat || user.stunned || user.weakened || user.paralysis) if(user.stat || user.stunned || user.weakened || user.paralysis)
unbuckle_mob() unbuckle_mob()
if(istype(user.l_hand, /obj/item/key) || istype(user.r_hand, /obj/item/key)) if(user.get_type_in_hands(/obj/item/key))
step(src, direction) step(src, direction)
update_mob() update_mob()
else else

View File

@@ -64,15 +64,14 @@
return return
var/obj/item/P = locate(href_list["write"]) var/obj/item/P = locate(href_list["write"])
if((P && P.loc == src)) //ifthe paper's on the board if((P && P.loc == src)) //ifthe paper's on the board
if(istype(usr.r_hand, /obj/item/weapon/pen)) //and you're holding a pen var/mob/living/M = usr
add_fingerprint(usr) if(istype(M))
P.attackby(usr.r_hand, usr) //then do ittttt var/obj/item/weapon/pen/E = M.get_type_in_hands(/obj/item/weapon/pen)
else if(E)
if(istype(usr.l_hand, /obj/item/weapon/pen)) //check other hand for pen add_fingerprint(M)
add_fingerprint(usr) P.attackby(E, usr)
P.attackby(usr.l_hand, usr)
else else
usr << "<span class='notice'>You'll need something to write with!</span>" M << "<span class='notice'>You'll need something to write with!</span>"
if(href_list["read"]) if(href_list["read"])
var/obj/item/weapon/paper/P = locate(href_list["read"]) var/obj/item/weapon/paper/P = locate(href_list["read"])
if((P && P.loc == src)) if((P && P.loc == src))

View File

@@ -90,7 +90,7 @@ FLOOR SAFES
var/mob/living/carbon/human/user = usr var/mob/living/carbon/human/user = usr
var/canhear = 0 var/canhear = 0
if(istype(user.l_hand, /obj/item/clothing/accessory/stethoscope) || istype(user.r_hand, /obj/item/clothing/accessory/stethoscope)) if(user.get_type_in_hands(/obj/item/clothing/accessory/stethoscope))
canhear = 1 canhear = 1
if(href_list["open"]) if(href_list["open"])

View File

@@ -358,7 +358,7 @@
if (ishuman(user)) if (ishuman(user))
var/mob/living/carbon/human/H = user var/mob/living/carbon/human/H = user
var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] var/obj/item/organ/external/temp = H.organs_by_name["r_hand"]
if (user.hand) if (H.hand)
temp = H.organs_by_name["l_hand"] temp = H.organs_by_name["l_hand"]
if(temp && !temp.is_usable()) if(temp && !temp.is_usable())
user << "<span class='notice'>You try to move your [temp.name], but cannot!</span>" user << "<span class='notice'>You try to move your [temp.name], but cannot!</span>"

View File

@@ -94,7 +94,7 @@
..() ..()
on_found(mob/finder as mob) on_found(mob/living/finder as mob)
if(armed) if(armed)
finder.visible_message("<span class='warning'>[finder] accidentally sets off [src], breaking their fingers.</span>", \ finder.visible_message("<span class='warning'>[finder] accidentally sets off [src], breaking their fingers.</span>", \
"<span class='warning'>You accidentally trigger [src]!</span>") "<span class='warning'>You accidentally trigger [src]!</span>")

View File

@@ -76,7 +76,7 @@
var/turf/location = src.loc var/turf/location = src.loc
if(istype(location, /mob/)) if(istype(location, /mob/))
var/mob/living/carbon/human/M = location var/mob/living/carbon/human/M = location
if(M.l_hand == src || M.r_hand == src || M.head == src) if(M.item_is_in_hands(src) || M.head == src)
location = M.loc location = M.loc
if (istype(location, /turf)) if (istype(location, /turf))

View File

@@ -22,7 +22,7 @@
say_verbs = list("mumbles", "says") say_verbs = list("mumbles", "says")
// Clumsy folks can't take the mask off themselves. // Clumsy folks can't take the mask off themselves.
/obj/item/clothing/mask/muzzle/attack_hand(mob/user as mob) /obj/item/clothing/mask/muzzle/attack_hand(mob/living/user as mob)
if(user.wear_mask == src && !user.IsAdvancedToolUser()) if(user.wear_mask == src && !user.IsAdvancedToolUser())
return 0 return 0
..() ..()

View File

@@ -1,6 +1,6 @@
/obj/item/weapon/rig/attackby(obj/item/W as obj, mob/user as mob) /obj/item/weapon/rig/attackby(obj/item/W as obj, mob/living/user as mob)
if(!istype(user,/mob/living)) return 0 if(!istype(user)) return 0
if(electrified != 0) if(electrified != 0)
if(shock(user)) //Handles removing charge from the cell, as well. No need to do that here. if(shock(user)) //Handles removing charge from the cell, as well. No need to do that here.

View File

@@ -15,7 +15,7 @@
var/mob/living/carbon/human/user = usr var/mob/living/carbon/human/user = usr
if (!(user.l_hand == src || user.r_hand == src)) if(!user.item_is_in_hands(src))
return //bag must be in your hands to use return //bag must be in your hands to use
if (isturf(I.loc)) if (isturf(I.loc))
@@ -31,10 +31,8 @@
var/obj/item/weapon/storage/U = I.loc var/obj/item/weapon/storage/U = I.loc
user.client.screen -= I user.client.screen -= I
U.contents.Remove(I) U.contents.Remove(I)
else if(user.l_hand == I) //in a hand else if(user.item_is_in_hands(I))
user.drop_l_hand() user.drop_from_inventory(I)
else if(user.r_hand == I) //in a hand
user.drop_r_hand()
else else
return return

View File

@@ -77,12 +77,8 @@
usr << "There are no cards in the deck." usr << "There are no cards in the deck."
return return
var/obj/item/weapon/hand/H var/obj/item/weapon/hand/H = user.get_type_in_hands(/obj/item/weapon/hand)
if(user.l_hand && istype(user.l_hand,/obj/item/weapon/hand)) if(!H)
H = user.l_hand
else if(user.r_hand && istype(user.r_hand,/obj/item/weapon/hand))
H = user.r_hand
else
H = new(get_turf(src)) H = new(get_turf(src))
user.put_in_hands(H) user.put_in_hands(H)

View File

@@ -172,7 +172,7 @@
if(seed) seed.thrown_at(src,hit_atom) if(seed) seed.thrown_at(src,hit_atom)
..() ..()
/obj/item/weapon/reagent_containers/food/snacks/grown/attackby(var/obj/item/weapon/W, var/mob/user) /obj/item/weapon/reagent_containers/food/snacks/grown/attackby(var/obj/item/weapon/W, var/mob/living/user)
if(seed) if(seed)
if(seed.get_trait(TRAIT_PRODUCES_POWER) && istype(W, /obj/item/stack/cable_coil)) if(seed.get_trait(TRAIT_PRODUCES_POWER) && istype(W, /obj/item/stack/cable_coil))
@@ -181,7 +181,7 @@
//TODO: generalize this. //TODO: generalize this.
user << "<span class='notice'>You add some cable to the [src.name] and slide it inside the battery casing.</span>" user << "<span class='notice'>You add some cable to the [src.name] and slide it inside the battery casing.</span>"
var/obj/item/weapon/cell/potato/pocell = new /obj/item/weapon/cell/potato(get_turf(user)) var/obj/item/weapon/cell/potato/pocell = new /obj/item/weapon/cell/potato(get_turf(user))
if(src.loc == user && !(user.l_hand && user.r_hand) && istype(user,/mob/living/carbon/human)) if(src.loc == user && istype(user,/mob/living/carbon/human))
user.put_in_hands(pocell) user.put_in_hands(pocell)
pocell.maxcharge = src.potency * 10 pocell.maxcharge = src.potency * 10
pocell.charge = pocell.maxcharge pocell.charge = pocell.maxcharge

View File

@@ -150,7 +150,7 @@
var/body_coverage = HEAD|FACE|EYES|UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS var/body_coverage = HEAD|FACE|EYES|UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
for(var/obj/item/clothing/clothes in target) for(var/obj/item/clothing/clothes in target)
if(target.l_hand == clothes|| target.r_hand == clothes) if(target.item_is_in_hands(clothes))
continue continue
body_coverage &= ~(clothes.body_parts_covered) body_coverage &= ~(clothes.body_parts_covered)
@@ -182,7 +182,7 @@
continue continue
var/body_coverage = HEAD|FACE|EYES|UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS var/body_coverage = HEAD|FACE|EYES|UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
for(var/obj/item/clothing/clothes in M) for(var/obj/item/clothing/clothes in M)
if(M.l_hand == clothes || M.r_hand == clothes) if(M.item_is_in_hands(clothes))
continue continue
body_coverage &= ~(clothes.body_parts_covered) body_coverage &= ~(clothes.body_parts_covered)
if(!body_coverage) if(!body_coverage)

View File

@@ -34,7 +34,7 @@
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(get_turf(src)) var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(get_turf(src))
P.name = "paper - [form_title]" P.name = "paper - [form_title]"
P.info = "[last_data]" P.info = "[last_data]"
if(istype(user,/mob/living/carbon/human) && !(user.l_hand && user.r_hand)) if(istype(user,/mob/living/carbon/human))
user.put_in_hands(P) user.put_in_hands(P)
user.visible_message("\The [src] spits out a piece of paper.") user.visible_message("\The [src] spits out a piece of paper.")
return return

View File

@@ -128,7 +128,7 @@ var/list/name_to_material
S.add_fingerprint(user) S.add_fingerprint(user)
S.add_to_stacks(user) S.add_to_stacks(user)
/material/proc/build_wired_product(var/mob/user, var/obj/item/stack/used_stack, var/obj/item/stack/target_stack) /material/proc/build_wired_product(var/mob/living/user, var/obj/item/stack/used_stack, var/obj/item/stack/target_stack)
if(!wire_product) if(!wire_product)
user << "<span class='warning'>You cannot make anything out of \the [target_stack]</span>" user << "<span class='warning'>You cannot make anything out of \the [target_stack]</span>"
return return
@@ -140,8 +140,7 @@ var/list/name_to_material
target_stack.use(1) target_stack.use(1)
user << "<span class='notice'>You attach wire to the [name].</span>" user << "<span class='notice'>You attach wire to the [name].</span>"
var/obj/item/product = new wire_product(get_turf(user)) var/obj/item/product = new wire_product(get_turf(user))
if(!(user.l_hand && user.r_hand)) user.put_in_hands(product)
user.put_in_hands(product)
// Make sure we have a display name and shard icon even if they aren't explicitly set. // Make sure we have a display name and shard icon even if they aren't explicitly set.
/material/New() /material/New()

View File

@@ -172,10 +172,9 @@ var/list/mining_overlay_cache = list()
if(istype(AM,/mob/living/carbon/human)) if(istype(AM,/mob/living/carbon/human))
var/mob/living/carbon/human/H = AM var/mob/living/carbon/human/H = AM
if((istype(H.l_hand,/obj/item/weapon/pickaxe)) && (!H.hand)) var/obj/item/weapon/pickaxe/P = H.get_inactive_hand()
attackby(H.l_hand,H) if(istype(P))
else if((istype(H.r_hand,/obj/item/weapon/pickaxe)) && H.hand) src.attackby(P, H)
attackby(H.r_hand,H)
else if(istype(AM,/mob/living/silicon/robot)) else if(istype(AM,/mob/living/silicon/robot))
var/mob/living/silicon/robot/R = AM var/mob/living/silicon/robot/R = AM

View File

@@ -1,43 +1,3 @@
//This proc is called whenever someone clicks an inventory ui slot.
/mob/proc/attack_ui(slot)
var/obj/item/W = get_active_hand()
if(istype(W))
equip_to_slot_if_possible(W, slot)
/mob/proc/put_in_any_hand_if_possible(obj/item/W as obj, del_on_fail = 0, disable_warning = 1, redraw_mob = 1)
if(equip_to_slot_if_possible(W, slot_l_hand, del_on_fail, disable_warning, redraw_mob))
return 1
else if(equip_to_slot_if_possible(W, slot_r_hand, del_on_fail, disable_warning, redraw_mob))
return 1
return 0
//This is a SAFE proc. Use this instead of equip_to_slot()!
//set del_on_fail to have it delete W if it fails to equip
//set disable_warning to disable the 'you are unable to equip that' warning.
//unset redraw_mob to prevent the mob from being redrawn at the end.
/mob/proc/equip_to_slot_if_possible(obj/item/W as obj, slot, del_on_fail = 0, disable_warning = 0, redraw_mob = 1)
if(!istype(W)) return 0
if(!W.mob_can_equip(src, slot))
if(del_on_fail)
qdel(W)
else
if(!disable_warning)
src << "\red You are unable to equip that." //Only print if del_on_fail is false
return 0
equip_to_slot(W, slot, redraw_mob) //This proc should not ever fail.
return 1
//This is an UNSAFE proc. It merely handles the actual job of equipping. All the checks on whether you can or can't eqip need to be done before! Use mob_can_equip() for that task.
//In most cases you will want to use equip_to_slot_if_possible()
/mob/proc/equip_to_slot(obj/item/W as obj, slot)
return
//This is just a commonly used configuration for the equip_to_slot_if_possible() proc, used to equip people when the rounds tarts and when events happen and such.
/mob/proc/equip_to_slot_or_del(obj/item/W as obj, slot)
return equip_to_slot_if_possible(W, slot, 1, 1, 0)
//The list of slots by priority. equip_to_appropriate_slot() uses this list. Doesn't matter if a mob type doesn't have a slot. //The list of slots by priority. equip_to_appropriate_slot() uses this list. Doesn't matter if a mob type doesn't have a slot.
var/list/slot_equipment_priority = list( \ var/list/slot_equipment_priority = list( \
slot_back,\ slot_back,\
@@ -58,6 +18,49 @@ var/list/slot_equipment_priority = list( \
slot_r_store\ slot_r_store\
) )
/mob
var/obj/item/weapon/storage/s_active = null // Even ghosts can/should be able to peek into boxes on the ground
//This proc is called whenever someone clicks an inventory ui slot.
/mob/proc/attack_ui(var/slot)
var/obj/item/W = get_active_hand()
if(istype(W))
equip_to_slot_if_possible(W, slot)
/* Inventory manipulation */
/mob/proc/put_in_any_hand_if_possible(obj/item/W as obj, del_on_fail = 0, disable_warning = 1, redraw_mob = 1)
if(equip_to_slot_if_possible(W, slot_l_hand, del_on_fail, disable_warning, redraw_mob))
return 1
else if(equip_to_slot_if_possible(W, slot_r_hand, del_on_fail, disable_warning, redraw_mob))
return 1
return 0
//This is a SAFE proc. Use this instead of equip_to_slot()!
//set del_on_fail to have it delete W if it fails to equip
//set disable_warning to disable the 'you are unable to equip that' warning.
//unset redraw_mob to prevent the mob from being redrawn at the end.
/mob/proc/equip_to_slot_if_possible(obj/item/W as obj, slot, del_on_fail = 0, disable_warning = 0, redraw_mob = 1)
if(!W.mob_can_equip(src, slot))
if(del_on_fail)
qdel(W)
else
if(!disable_warning)
src << "\red You are unable to equip that." //Only print if del_on_fail is false
return 0
equip_to_slot(W, slot, redraw_mob) //This proc should not ever fail.
return 1
//This is an UNSAFE proc. It merely handles the actual job of equipping. All the checks on whether you can or can't eqip need to be done before! Use mob_can_equip() for that task.
//In most cases you will want to use equip_to_slot_if_possible()
/mob/proc/equip_to_slot(obj/item/W as obj, slot)
return
//This is just a commonly used configuration for the equip_to_slot_if_possible() proc, used to equip people when the rounds tarts and when events happen and such.
/mob/proc/equip_to_slot_or_del(obj/item/W as obj, slot)
return equip_to_slot_if_possible(W, slot, 1, 1, 0)
//Checks if a given slot can be accessed at this time, either to equip or unequip I //Checks if a given slot can be accessed at this time, either to equip or unequip I
/mob/proc/slot_is_accessible(var/slot, var/obj/item/I, mob/user=null) /mob/proc/slot_is_accessible(var/slot, var/obj/item/I, mob/user=null)
return 1 return 1
@@ -65,8 +68,6 @@ var/list/slot_equipment_priority = list( \
//puts the item "W" into an appropriate slot in a human's inventory //puts the item "W" into an appropriate slot in a human's inventory
//returns 0 if it cannot, 1 if successful //returns 0 if it cannot, 1 if successful
/mob/proc/equip_to_appropriate_slot(obj/item/W) /mob/proc/equip_to_appropriate_slot(obj/item/W)
if(!istype(W)) return 0
for(var/slot in slot_equipment_priority) for(var/slot in slot_equipment_priority)
if(equip_to_slot_if_possible(W, slot, del_on_fail=0, disable_warning=1, redraw_mob=1)) if(equip_to_slot_if_possible(W, slot, del_on_fail=0, disable_warning=1, redraw_mob=1))
return 1 return 1
@@ -74,32 +75,15 @@ var/list/slot_equipment_priority = list( \
return 0 return 0
/mob/proc/equip_to_storage(obj/item/newitem) /mob/proc/equip_to_storage(obj/item/newitem)
// Try put it in their backpack
if(istype(src.back,/obj/item/weapon/storage))
var/obj/item/weapon/storage/backpack = src.back
if(backpack.contents.len < backpack.storage_slots)
newitem.forceMove(src.back)
return 1
// Try to place it in any item that can store stuff, on the mob.
for(var/obj/item/weapon/storage/S in src.contents)
if (S.contents.len < S.storage_slots)
newitem.forceMove(S)
return 1
return 0 return 0
//These procs handle putting s tuff in your hand. It's probably best to use these rather than setting l_hand = ...etc /* Hands */
//as they handle all relevant stuff like adding it to the player's screen and updating their overlays.
//Returns the thing in our active hand //Returns the thing in our active hand
/mob/proc/get_active_hand() /mob/proc/get_active_hand()
if(hand) return l_hand
else return r_hand
//Returns the thing in our inactive hand //Returns the thing in our inactive hand
/mob/proc/get_inactive_hand() /mob/proc/get_inactive_hand()
if(hand) return r_hand
else return l_hand
//Puts the item into your l_hand if possible and calls all necessary triggers/updates. returns 1 on success. //Puts the item into your l_hand if possible and calls all necessary triggers/updates. returns 1 on success.
/mob/proc/put_in_l_hand(var/obj/item/W) /mob/proc/put_in_l_hand(var/obj/item/W)
@@ -150,16 +134,15 @@ var/list/slot_equipment_priority = list( \
//Drops the item in our left hand //Drops the item in our left hand
/mob/proc/drop_l_hand(var/atom/Target) /mob/proc/drop_l_hand(var/atom/Target)
return drop_from_inventory(l_hand, Target) return 0
//Drops the item in our right hand //Drops the item in our right hand
/mob/proc/drop_r_hand(var/atom/Target) /mob/proc/drop_r_hand(var/atom/Target)
return drop_from_inventory(r_hand, Target) return 0
//Drops the item in our active hand. TODO: rename this to drop_active_hand or something //Drops the item in our active hand. TODO: rename this to drop_active_hand or something
/mob/proc/drop_item(var/atom/Target) /mob/proc/drop_item(var/atom/Target)
if(hand) return drop_l_hand(Target) return
else return drop_r_hand(Target)
/* /*
Removes the object from any slots the mob might have, calling the appropriate icon update proc. Removes the object from any slots the mob might have, calling the appropriate icon update proc.
@@ -173,19 +156,6 @@ var/list/slot_equipment_priority = list( \
the search through all the slots, without having to duplicate the rest of the item dropping. the search through all the slots, without having to duplicate the rest of the item dropping.
*/ */
/mob/proc/u_equip(obj/W as obj) /mob/proc/u_equip(obj/W as obj)
if (W == r_hand)
r_hand = null
update_inv_r_hand(0)
else if (W == l_hand)
l_hand = null
update_inv_l_hand(0)
else if (W == back)
back = null
update_inv_back(0)
else if (W == wear_mask)
wear_mask = null
update_inv_wear_mask(0)
return
/mob/proc/isEquipped(obj/item/I) /mob/proc/isEquipped(obj/item/I)
if(!I) if(!I)
@@ -229,11 +199,6 @@ var/list/slot_equipment_priority = list( \
//Returns the item equipped to the specified slot, if any. //Returns the item equipped to the specified slot, if any.
/mob/proc/get_equipped_item(var/slot) /mob/proc/get_equipped_item(var/slot)
switch(slot)
if(slot_l_hand) return l_hand
if(slot_r_hand) return r_hand
if(slot_back) return back
if(slot_wear_mask) return wear_mask
return null return null
//Outdated but still in use apparently. This should at least be a human proc. //Outdated but still in use apparently. This should at least be a human proc.

View File

@@ -288,7 +288,7 @@
/* Assembly */ /* Assembly */
/obj/item/weapon/storage/toolbox/mechanical/attackby(var/obj/item/stack/tile/floor/T, mob/user as mob) /obj/item/weapon/storage/toolbox/mechanical/attackby(var/obj/item/stack/tile/floor/T, mob/living/user as mob)
if(!istype(T, /obj/item/stack/tile/floor)) if(!istype(T, /obj/item/stack/tile/floor))
..() ..()
return return

View File

@@ -2,7 +2,7 @@
var/mob/living/carbon/human/H = over_object var/mob/living/carbon/human/H = over_object
if(!istype(H) || !Adjacent(H)) if(!istype(H) || !Adjacent(H))
return ..() return ..()
if(H.a_intent == "grab" && hat && !(H.l_hand && H.r_hand)) if(H.a_intent == "grab" && hat && !H.hands_are_full())
hat.loc = get_turf(src) hat.loc = get_turf(src)
H.put_in_hands(hat) H.put_in_hands(hat)
H.visible_message("<span class='danger'>\The [H] removes \the [src]'s [hat].</span>") H.visible_message("<span class='danger'>\The [H] removes \the [src]'s [hat].</span>")

View File

@@ -3,40 +3,40 @@
set name = "Give" set name = "Give"
// TODO : Change to incapacitated() on merge. // TODO : Change to incapacitated() on merge.
if(usr.stat || usr.lying || usr.resting || usr.buckled) if(src.stat || src.lying || src.resting || src.buckled)
return return
if(!istype(target) || target.stat || target.lying || target.resting || target.buckled || target.client == null) if(!istype(target) || target.stat || target.lying || target.resting || target.buckled || target.client == null)
return return
var/obj/item/I = usr.get_active_hand() var/obj/item/I = src.get_active_hand()
if(!I) if(!I)
I = usr.get_inactive_hand() I = src.get_inactive_hand()
if(!I) if(!I)
usr << "<span class='warning'>You don't have anything in your hands to give to \the [target].</span>" src << "<span class='warning'>You don't have anything in your hands to give to \the [target].</span>"
return return
if(alert(target,"[usr] wants to give you \a [I]. Will you accept it?",,"No","Yes") == "No") if(alert(target,"[src] wants to give you \a [I]. Will you accept it?",,"No","Yes") == "No")
target.visible_message("<span class='notice'>\The [usr] tried to hand \the [I] to \the [target], \ target.visible_message("<span class='notice'>\The [src] tried to hand \the [I] to \the [target], \
but \the [target] didn't want it.</span>") but \the [target] didn't want it.</span>")
return return
if(!I) return if(!I) return
if(!Adjacent(target)) if(!Adjacent(target))
usr << "<span class='warning'>You need to stay in reaching distance while giving an object.</span>" src << "<span class='warning'>You need to stay in reaching distance while giving an object.</span>"
target << "<span class='warning'>\The [usr] moved too far away.</span>" target << "<span class='warning'>\The [src] moved too far away.</span>"
return return
if(I.loc != usr || (usr.l_hand != I && usr.r_hand != I)) if(I.loc != src || !src.item_is_in_hands(I))
usr << "<span class='warning'>You need to keep the item in your hands.</span>" src << "<span class='warning'>You need to keep the item in your hands.</span>"
target << "<span class='warning'>\The [usr] seems to have given up on passing \the [I] to you.</span>" target << "<span class='warning'>\The [src] seems to have given up on passing \the [I] to you.</span>"
return return
if(target.r_hand != null && target.l_hand != null) if(target.hands_are_full())
target << "<span class='warning'>Your hands are full.</span>" target << "<span class='warning'>Your hands are full.</span>"
usr << "<span class='warning'>Their hands are full.</span>" src << "<span class='warning'>Their hands are full.</span>"
return return
if(usr.unEquip(I)) if(src.unEquip(I))
target.put_in_hands(I) // If this fails it will just end up on the floor, but that's fitting for things like dionaea. target.put_in_hands(I) // If this fails it will just end up on the floor, but that's fitting for things like dionaea.
target.visible_message("<span class='notice'>\The [usr] handed \the [I] to \the [target].</span>") target.visible_message("<span class='notice'>\The [src] handed \the [I] to \the [target].</span>")

View File

@@ -538,9 +538,9 @@
if ("handshake") if ("handshake")
m_type = 1 m_type = 1
if (!src.restrained() && !src.r_hand) if (!src.restrained() && !src.r_hand)
var/mob/M = null var/mob/living/M = null
if (param) if (param)
for (var/mob/A in view(1, null)) for (var/mob/living/A in view(1, null))
if (param == A.name) if (param == A.name)
M = A M = A
break break

View File

@@ -207,7 +207,7 @@
var/covered = 0 // Basic coverage can help. var/covered = 0 // Basic coverage can help.
for(var/obj/item/clothing/clothes in H) for(var/obj/item/clothing/clothes in H)
if(H.l_hand == clothes|| H.r_hand == clothes) if(H.item_is_in_hands(clothes))
continue continue
if((clothes.body_parts_covered & UPPER_TORSO) && (clothes.body_parts_covered & LOWER_TORSO)) if((clothes.body_parts_covered & UPPER_TORSO) && (clothes.body_parts_covered & LOWER_TORSO))
covered = 1 covered = 1

View File

@@ -0,0 +1,172 @@
/mob/living
var/hand = null
var/obj/item/l_hand = null
var/obj/item/r_hand = null
var/obj/item/weapon/back = null//Human/Monkey
var/obj/item/weapon/tank/internal = null//Human/Monkey
var/obj/item/clothing/mask/wear_mask = null//Carbon
/mob/living/equip_to_storage(obj/item/newitem)
// Try put it in their backpack
if(istype(src.back,/obj/item/weapon/storage))
var/obj/item/weapon/storage/backpack = src.back
if(backpack.contents.len < backpack.storage_slots)
newitem.forceMove(src.back)
return 1
// Try to place it in any item that can store stuff, on the mob.
for(var/obj/item/weapon/storage/S in src.contents)
if (S.contents.len < S.storage_slots)
newitem.forceMove(S)
return 1
return 0
//Returns the thing in our active hand
/mob/living/get_active_hand()
if(hand) return l_hand
else return r_hand
//Returns the thing in our inactive hand
/mob/living/get_inactive_hand()
if(hand) return r_hand
else return l_hand
//Drops the item in our active hand. TODO: rename this to drop_active_hand or something
/mob/living/drop_item(var/atom/Target)
if(hand) return drop_l_hand(Target)
else return drop_r_hand(Target)
//Drops the item in our left hand
/mob/living/drop_l_hand(var/atom/Target)
return drop_from_inventory(l_hand, Target)
//Drops the item in our right hand
/mob/living/drop_r_hand(var/atom/Target)
return drop_from_inventory(r_hand, Target)
/mob/living/proc/hands_are_full()
return (r_hand && l_hand)
/mob/living/proc/item_is_in_hands(var/obj/item/I)
return (I == r_hand || I == l_hand)
/mob/living/proc/update_held_icons()
if(l_hand)
l_hand.update_held_icon()
if(r_hand)
r_hand.update_held_icon()
/mob/living/proc/get_type_in_hands(var/T)
if(istype(l_hand, T))
return l_hand
if(istype(r_hand, T))
return r_hand
return null
/mob/living/proc/get_left_hand()
return l_hand
/mob/living/proc/get_right_hand()
return r_hand
/mob/living/u_equip(obj/W as obj)
if (W == r_hand)
r_hand = null
update_inv_r_hand(0)
else if (W == l_hand)
l_hand = null
update_inv_l_hand(0)
else if (W == back)
back = null
update_inv_back(0)
else if (W == wear_mask)
wear_mask = null
update_inv_wear_mask(0)
return
/mob/living/get_equipped_item(var/slot)
switch(slot)
if(slot_l_hand) return l_hand
if(slot_r_hand) return r_hand
if(slot_back) return back
if(slot_wear_mask) return wear_mask
return null
/mob/living/show_inv(mob/user as mob)
user.set_machine(src)
var/dat = {"
<B><HR><FONT size=3>[name]</FONT></B>
<BR><HR>
<BR><B>Head(Mask):</B> <A href='?src=\ref[src];item=mask'>[(wear_mask ? wear_mask : "Nothing")]</A>
<BR><B>Left Hand:</B> <A href='?src=\ref[src];item=l_hand'>[(l_hand ? l_hand : "Nothing")]</A>
<BR><B>Right Hand:</B> <A href='?src=\ref[src];item=r_hand'>[(r_hand ? r_hand : "Nothing")]</A>
<BR><B>Back:</B> <A href='?src=\ref[src];item=back'>[(back ? back : "Nothing")]</A> [((istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/weapon/tank) && !( internal )) ? text(" <A href='?src=\ref[];item=internal'>Set Internal</A>", src) : "")]
<BR>[(internal ? text("<A href='?src=\ref[src];item=internal'>Remove Internal</A>") : "")]
<BR><A href='?src=\ref[src];item=pockets'>Empty Pockets</A>
<BR><A href='?src=\ref[user];refresh=1'>Refresh</A>
<BR><A href='?src=\ref[user];mach_close=mob[name]'>Close</A>
<BR>"}
user << browse(dat, text("window=mob[];size=325x500", name))
onclose(user, "mob[name]")
return
/mob/living/ret_grab(obj/effect/list_container/mobl/L as obj, flag)
if ((!( istype(l_hand, /obj/item/weapon/grab) ) && !( istype(r_hand, /obj/item/weapon/grab) )))
if (!( L ))
return null
else
return L.container
else
if (!( L ))
L = new /obj/effect/list_container/mobl( null )
L.container += src
L.master = src
if (istype(l_hand, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = l_hand
if (!( L.container.Find(G.affecting) ))
L.container += G.affecting
if (G.affecting)
G.affecting.ret_grab(L, 1)
if (istype(r_hand, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = r_hand
if (!( L.container.Find(G.affecting) ))
L.container += G.affecting
if (G.affecting)
G.affecting.ret_grab(L, 1)
if (!( flag ))
if (L.master == src)
var/list/temp = list( )
temp += L.container
//L = null
qdel(L)
return temp
else
return L.container
return
/mob/living/mode()
set name = "Activate Held Object"
set category = "Object"
set src = usr
if(istype(loc,/obj/mecha)) return
if(hand)
var/obj/item/W = l_hand
if (W)
W.attack_self(src)
update_inv_l_hand()
else
var/obj/item/W = r_hand
if (W)
W.attack_self(src)
update_inv_r_hand()
return
/mob/living/abiotic(var/full_body = 0)
if(full_body && ((src.l_hand && !( src.l_hand.abstract )) || (src.r_hand && !( src.r_hand.abstract )) || (src.back || src.wear_mask)))
return 1
if((src.l_hand && !( src.l_hand.abstract )) || (src.r_hand && !( src.r_hand.abstract )))
return 1
return 0

View File

@@ -865,3 +865,63 @@ default behaviour is:
sleep(350) sleep(350)
lastpuke = 0 lastpuke = 0
/mob/living/update_canmove()
if(!resting && cannot_stand() && can_stand_overridden())
lying = 0
canmove = 1
else
if(istype(buckled, /obj/vehicle))
var/obj/vehicle/V = buckled
if(cannot_stand())
lying = 0
canmove = 1
pixel_y = V.mob_offset_y - 5
else
if(buckled.buckle_lying != -1) lying = buckled.buckle_lying
canmove = 1
pixel_y = V.mob_offset_y
else if(buckled)
anchored = 1
canmove = 0
if(istype(buckled))
if(buckled.buckle_lying != -1)
lying = buckled.buckle_lying
if(buckled.buckle_movable)
anchored = 0
canmove = 1
else if(cannot_stand())
lying = 1
canmove = 0
else if(stunned)
canmove = 0
else if(captured)
anchored = 1
canmove = 0
lying = 0
else
lying = 0
canmove = 1
if(lying)
density = 0
if(l_hand) unEquip(l_hand)
if(r_hand) unEquip(r_hand)
else
density = initial(density)
for(var/obj/item/weapon/grab/G in grabbed_by)
if(G.state >= GRAB_AGGRESSIVE)
canmove = 0
break
//Temporarily moved here from the various life() procs
//I'm fixing stuff incrementally so this will likely find a better home.
//It just makes sense for now. ~Carn
if( update_icon ) //forces a full overlay update
update_icon = 0
regenerate_icons()
else if( lying != lying_prev )
update_icons()
return canmove

View File

@@ -195,21 +195,6 @@
/mob/proc/show_inv(mob/user as mob) /mob/proc/show_inv(mob/user as mob)
user.set_machine(src)
var/dat = {"
<B><HR><FONT size=3>[name]</FONT></B>
<BR><HR>
<BR><B>Head(Mask):</B> <A href='?src=\ref[src];item=mask'>[(wear_mask ? wear_mask : "Nothing")]</A>
<BR><B>Left Hand:</B> <A href='?src=\ref[src];item=l_hand'>[(l_hand ? l_hand : "Nothing")]</A>
<BR><B>Right Hand:</B> <A href='?src=\ref[src];item=r_hand'>[(r_hand ? r_hand : "Nothing")]</A>
<BR><B>Back:</B> <A href='?src=\ref[src];item=back'>[(back ? back : "Nothing")]</A> [((istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/weapon/tank) && !( internal )) ? text(" <A href='?src=\ref[];item=internal'>Set Internal</A>", src) : "")]
<BR>[(internal ? text("<A href='?src=\ref[src];item=internal'>Remove Internal</A>") : "")]
<BR><A href='?src=\ref[src];item=pockets'>Empty Pockets</A>
<BR><A href='?src=\ref[user];refresh=1'>Refresh</A>
<BR><A href='?src=\ref[user];mach_close=mob[name]'>Close</A>
<BR>"}
user << browse(dat, text("window=mob[];size=325x500", name))
onclose(user, "mob[name]")
return return
//mob verbs are faster than object verbs. See http://www.byond.com/forum/?post=1326139&page=2#comment8198716 for why this isn't atom/verb/examine() //mob verbs are faster than object verbs. See http://www.byond.com/forum/?post=1326139&page=2#comment8198716 for why this isn't atom/verb/examine()
@@ -248,37 +233,6 @@
/mob/proc/ret_grab(obj/effect/list_container/mobl/L as obj, flag) /mob/proc/ret_grab(obj/effect/list_container/mobl/L as obj, flag)
if ((!( istype(l_hand, /obj/item/weapon/grab) ) && !( istype(r_hand, /obj/item/weapon/grab) )))
if (!( L ))
return null
else
return L.container
else
if (!( L ))
L = new /obj/effect/list_container/mobl( null )
L.container += src
L.master = src
if (istype(l_hand, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = l_hand
if (!( L.container.Find(G.affecting) ))
L.container += G.affecting
if (G.affecting)
G.affecting.ret_grab(L, 1)
if (istype(r_hand, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = r_hand
if (!( L.container.Find(G.affecting) ))
L.container += G.affecting
if (G.affecting)
G.affecting.ret_grab(L, 1)
if (!( flag ))
if (L.master == src)
var/list/temp = list( )
temp += L.container
//L = null
qdel(L)
return temp
else
return L.container
return return
/mob/verb/mode() /mob/verb/mode()
@@ -286,18 +240,6 @@
set category = "Object" set category = "Object"
set src = usr set src = usr
if(istype(loc,/obj/mecha)) return
if(hand)
var/obj/item/W = l_hand
if (W)
W.attack_self(src)
update_inv_l_hand()
else
var/obj/item/W = r_hand
if (W)
W.attack_self(src)
update_inv_r_hand()
return return
/* /*
@@ -735,65 +677,6 @@
//Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it. //Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it.
/mob/proc/update_canmove() /mob/proc/update_canmove()
if(!resting && cannot_stand() && can_stand_overridden())
lying = 0
canmove = 1
else
if(istype(buckled, /obj/vehicle))
var/obj/vehicle/V = buckled
if(cannot_stand())
lying = 0
canmove = 1
pixel_y = V.mob_offset_y - 5
else
if(buckled.buckle_lying != -1) lying = buckled.buckle_lying
canmove = 1
pixel_y = V.mob_offset_y
else if(buckled)
anchored = 1
canmove = 0
if(istype(buckled))
if(buckled.buckle_lying != -1)
lying = buckled.buckle_lying
if(buckled.buckle_movable)
anchored = 0
canmove = 1
else if(cannot_stand())
lying = 1
canmove = 0
else if(stunned)
canmove = 0
else if(captured)
anchored = 1
canmove = 0
lying = 0
else
lying = 0
canmove = 1
if(lying)
density = 0
if(l_hand) unEquip(l_hand)
if(r_hand) unEquip(r_hand)
else
density = initial(density)
for(var/obj/item/weapon/grab/G in grabbed_by)
if(G.state >= GRAB_AGGRESSIVE)
canmove = 0
break
//Temporarily moved here from the various life() procs
//I'm fixing stuff incrementally so this will likely find a better home.
//It just makes sense for now. ~Carn
if( update_icon ) //forces a full overlay update
update_icon = 0
regenerate_icons()
else if( lying != lying_prev )
update_icons()
return canmove return canmove
@@ -1007,8 +890,7 @@ mob/proc/yank_out_object()
R.adjustFireLoss(10) R.adjustFireLoss(10)
selection.forceMove(get_turf(src)) selection.forceMove(get_turf(src))
if(!(U.l_hand && U.r_hand)) U.put_in_hands(selection)
U.put_in_hands(selection)
for(var/obj/item/weapon/O in pinned) for(var/obj/item/weapon/O in pinned)
if(O == selection) if(O == selection)

View File

@@ -60,7 +60,6 @@
var/next_move = null var/next_move = null
var/transforming = null //Carbon var/transforming = null //Carbon
var/other = 0.0 var/other = 0.0
var/hand = null
var/eye_blind = null //Carbon var/eye_blind = null //Carbon
var/eye_blurry = null //Carbon var/eye_blurry = null //Carbon
var/ear_deaf = null //Carbon var/ear_deaf = null //Carbon
@@ -119,12 +118,6 @@
var/m_intent = "run"//Living var/m_intent = "run"//Living
var/lastKnownIP = null var/lastKnownIP = null
var/obj/buckled = null//Living var/obj/buckled = null//Living
var/obj/item/l_hand = null//Living
var/obj/item/r_hand = null//Living
var/obj/item/weapon/back = null//Human/Monkey
var/obj/item/weapon/tank/internal = null//Human/Monkey
var/obj/item/weapon/storage/s_active = null//Carbon
var/obj/item/clothing/mask/wear_mask = null//Carbon
var/seer = 0 //for cult//Carbon, probably Human var/seer = 0 //for cult//Carbon, probably Human

View File

@@ -5,8 +5,10 @@
///Called by client/Move() ///Called by client/Move()
///Checks to see if you are grabbing anything and if moving will affect your grab. ///Checks to see if you are grabbing anything and if moving will affect your grab.
/client/proc/Process_Grab() /client/proc/Process_Grab()
for(var/obj/item/weapon/grab/G in list(mob.l_hand, mob.r_hand)) if(istype(mob, /mob/living))
G.reset_kill_state() //no wandering across the station/asteroid while choking someone var/mob/living/L = mob
for(var/obj/item/weapon/grab/G in list(L.l_hand, L.r_hand))
G.reset_kill_state() //no wandering across the station/asteroid while choking someone
/obj/item/weapon/grab /obj/item/weapon/grab
name = "grab" name = "grab"

View File

@@ -288,12 +288,6 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
/mob/proc/abiotic(var/full_body = 0) /mob/proc/abiotic(var/full_body = 0)
if(full_body && ((src.l_hand && !( src.l_hand.abstract )) || (src.r_hand && !( src.r_hand.abstract )) || (src.back || src.wear_mask)))
return 1
if((src.l_hand && !( src.l_hand.abstract )) || (src.r_hand && !( src.r_hand.abstract )))
return 1
return 0 return 0
//converts intent-strings into numbers and back //converts intent-strings into numbers and back

View File

@@ -19,6 +19,15 @@
/mob/proc/update_inv_back() /mob/proc/update_inv_back()
return return
/mob/proc/update_inv_active_hand()
return
/mob/living/update_inv_active_hand(var/A)
if(hand)
update_inv_l_hand(A)
else
update_inv_r_hand(A)
/mob/proc/update_inv_l_hand() /mob/proc/update_inv_l_hand()
return return

View File

@@ -98,7 +98,7 @@
if (2) if (2)
take_damage(4) take_damage(4)
/obj/item/organ/external/attack_self(var/mob/user) /obj/item/organ/external/attack_self(var/mob/living/user)
if(!contents.len) if(!contents.len)
return ..() return ..()
var/list/removable_objects = list() var/list/removable_objects = list()
@@ -113,8 +113,7 @@
var/obj/item/I = pick(removable_objects) var/obj/item/I = pick(removable_objects)
I.loc = get_turf(user) //just in case something was embedded that is not an item I.loc = get_turf(user) //just in case something was embedded that is not an item
if(istype(I)) if(istype(I))
if(!(user.l_hand && user.r_hand)) user.put_in_hands(I)
user.put_in_hands(I)
user.visible_message("<span class='danger'>\The [user] rips \the [I] out of \the [src]!</span>") user.visible_message("<span class='danger'>\The [user] rips \the [I] out of \the [src]!</span>")
return //no eating the limb until everything's been removed return //no eating the limb until everything's been removed
return ..() return ..()
@@ -128,7 +127,7 @@
usr << "<span class='danger'>There is \a [I] sticking out of it.</span>" usr << "<span class='danger'>There is \a [I] sticking out of it.</span>"
return return
/obj/item/organ/external/attackby(obj/item/weapon/W as obj, mob/user as mob) /obj/item/organ/external/attackby(obj/item/weapon/W as obj, mob/living/user as mob)
switch(stage) switch(stage)
if(0) if(0)
if(istype(W,/obj/item/weapon/scalpel)) if(istype(W,/obj/item/weapon/scalpel))
@@ -145,8 +144,7 @@
if(contents.len) if(contents.len)
var/obj/item/removing = pick(contents) var/obj/item/removing = pick(contents)
removing.loc = get_turf(user.loc) removing.loc = get_turf(user.loc)
if(!(user.l_hand && user.r_hand)) user.put_in_hands(removing)
user.put_in_hands(removing)
user.visible_message("<span class='danger'><b>[user]</b> extracts [removing] from [src] with [W]!</span>") user.visible_message("<span class='danger'><b>[user]</b> extracts [removing] from [src] with [W]!</span>")
else else
user.visible_message("<span class='danger'><b>[user]</b> fishes around fruitlessly in [src] with [W].</span>") user.visible_message("<span class='danger'><b>[user]</b> fishes around fruitlessly in [src] with [W].</span>")

View File

@@ -337,8 +337,9 @@
var/obj/item/i = usr.get_active_hand() // Check to see if he still got that darn pen, also check if he's using a crayon or pen. var/obj/item/i = usr.get_active_hand() // Check to see if he still got that darn pen, also check if he's using a crayon or pen.
var/iscrayon = 0 var/iscrayon = 0
if(!istype(i, /obj/item/weapon/pen)) if(!istype(i, /obj/item/weapon/pen))
if(usr.back && istype(usr.back,/obj/item/weapon/rig)) var/mob/living/M = usr
var/obj/item/weapon/rig/r = usr.back if(istype(M) && M.back && istype(M.back,/obj/item/weapon/rig))
var/obj/item/weapon/rig/r = M.back
var/obj/item/rig_module/device/pen/m = locate(/obj/item/rig_module/device/pen) in r.installed_modules var/obj/item/rig_module/device/pen/m = locate(/obj/item/rig_module/device/pen) in r.installed_modules
if(!r.offline && m) if(!r.offline && m)
i = m.device i = m.device

View File

@@ -91,7 +91,7 @@ var/global/photo_count = 0
/obj/item/weapon/storage/photo_album/MouseDrop(obj/over_object as obj) /obj/item/weapon/storage/photo_album/MouseDrop(obj/over_object as obj)
if((istype(usr, /mob/living/carbon/human))) if((istype(usr, /mob/living/carbon/human)))
var/mob/M = usr var/mob/living/carbon/human/M = usr
if(!( istype(over_object, /obj/screen) )) if(!( istype(over_object, /obj/screen) ))
return ..() return ..()
playsound(loc, "rustle", 50, 1, -5) playsound(loc, "rustle", 50, 1, -5)

View File

@@ -93,7 +93,7 @@
if(requires_two_hands) if(requires_two_hands)
var/mob/living/M = loc var/mob/living/M = loc
if(istype(M)) if(istype(M))
if((M.l_hand == src && !M.r_hand) || (M.r_hand == src && !M.l_hand)) if(M.item_is_in_hands(src) && !M.hands_are_full())
name = "[initial(name)] (wielded)" name = "[initial(name)] (wielded)"
item_state = wielded_icon item_state = wielded_icon
else else
@@ -179,7 +179,7 @@
var/held_acc_mod = 0 var/held_acc_mod = 0
var/held_disp_mod = 0 var/held_disp_mod = 0
if(requires_two_hands) if(requires_two_hands)
if((user.l_hand == src && user.r_hand) || (user.r_hand == src && user.l_hand)) if(user.item_is_in_hands(src) && user.hands_are_full())
held_acc_mod = -3 held_acc_mod = -3
held_disp_mod = 3 held_disp_mod = 3

View File

@@ -171,10 +171,10 @@
name = "holdout signal pistol" name = "holdout signal pistol"
magazine_type = /obj/item/ammo_magazine/mc9mm/flash magazine_type = /obj/item/ammo_magazine/mc9mm/flash
/obj/item/weapon/gun/projectile/pistol/attack_hand(mob/user as mob) /obj/item/weapon/gun/projectile/pistol/attack_hand(mob/living/user as mob)
if(user.get_inactive_hand() == src) if(user.get_inactive_hand() == src)
if(silenced) if(silenced)
if(user.l_hand != src && user.r_hand != src) if(!user.item_is_in_hands(src))
..() ..()
return return
user << "<span class='notice'>You unscrew [silenced] from [src].</span>" user << "<span class='notice'>You unscrew [silenced] from [src].</span>"
@@ -185,9 +185,9 @@
return return
..() ..()
/obj/item/weapon/gun/projectile/pistol/attackby(obj/item/I as obj, mob/user as mob) /obj/item/weapon/gun/projectile/pistol/attackby(obj/item/I as obj, mob/living/user as mob)
if(istype(I, /obj/item/weapon/silencer)) if(istype(I, /obj/item/weapon/silencer))
if(user.l_hand != src && user.r_hand != src) //if we're not in his hands if(!user.item_is_in_hands(src)) //if we're not in his hands
user << "<span class='notice'>You'll need [src] in your hands to do that.</span>" user << "<span class='notice'>You'll need [src] in your hands to do that.</span>"
return return
user.drop_item() user.drop_item()

View File

@@ -113,7 +113,8 @@ obj/aiming_overlay/proc/update_aiming_deferred()
var/cancel_aim = 1 var/cancel_aim = 1
if(!(aiming_with in owner) || (istype(owner, /mob/living/carbon/human) && (owner.l_hand != aiming_with && owner.r_hand != aiming_with))) var/mob/living/carbon/human/H = owner
if(!(aiming_with in owner) || (istype(H) && !H.item_is_in_hands(aiming_with)))
owner << "<span class='warning'>You must keep hold of your weapon!</span>" owner << "<span class='warning'>You must keep hold of your weapon!</span>"
else if(owner.eye_blind) else if(owner.eye_blind)
owner << "<span class='warning'>You are blind and cannot see your target!</span>" owner << "<span class='warning'>You are blind and cannot see your target!</span>"

View File

@@ -108,10 +108,9 @@
. = ..() . = ..()
if(istype(AM,/mob/living/carbon/human)) if(istype(AM,/mob/living/carbon/human))
var/mob/living/carbon/human/H = AM var/mob/living/carbon/human/H = AM
if((istype(H.l_hand,/obj/item/weapon/pickaxe)) && (!H.hand)) var/obj/item/weapon/pickaxe/P = H.get_inactive_hand()
attackby(H.l_hand,H) if(istype(P))
else if((istype(H.r_hand,/obj/item/weapon/pickaxe)) && H.hand) src.attackby(P, H)
attackby(H.r_hand,H)
else if(istype(AM,/mob/living/silicon/robot)) else if(istype(AM,/mob/living/silicon/robot))
var/mob/living/silicon/robot/R = AM var/mob/living/silicon/robot/R = AM

View File

@@ -1267,6 +1267,7 @@
#include "code\modules\mob\living\autohiss.dm" #include "code\modules\mob\living\autohiss.dm"
#include "code\modules\mob\living\damage_procs.dm" #include "code\modules\mob\living\damage_procs.dm"
#include "code\modules\mob\living\default_language.dm" #include "code\modules\mob\living\default_language.dm"
#include "code\modules\mob\living\inventory.dm"
#include "code\modules\mob\living\life.dm" #include "code\modules\mob\living\life.dm"
#include "code\modules\mob\living\living.dm" #include "code\modules\mob\living\living.dm"
#include "code\modules\mob\living\living_defense.dm" #include "code\modules\mob\living\living_defense.dm"