diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 5536e6b4..eafca057 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -97,3 +97,51 @@ proc/RoundHealth(health) else return "health-100" return "0" + + +/proc/this_guy_is_allowed_to_drag_that_guy_into_something(atom/movable/target as mob|obj, mob/user as mob, obj/target_object as obj) + if(istype(target, /obj/screen)) //fix for HUD elements making their way into the world - Pete + return + if(target.loc == user) //no you can't pull things out of your ass + return + if(user.restrained() || user.stat || user.weakened || user.stunned || user.paralysis || user.resting) //are you cuffed, dying, lying, stunned or other + return + if(get_dist(user, target_object) > 1 || get_dist(user, target) > 1 || user.contents.Find(target_object)) // is the mob anchored, too far away from you, or are you too far away from the source + return + if(!ismob(target)) //mobs only + return + if(!ishuman(user) && !isrobot(user)) //No ghosts or mice putting people into the sleeper + return + if(istype(user, /mob/living/silicon/robot/drone)) // drones don't get to use medical machinery + return + if(user.loc==null) // just in case someone manages to get a closet into the blue light dimension, as unlikely as that seems + return + if(!istype(user.loc, /turf) || !istype(target.loc, /turf)) // are you in a container/closet/pod/etc? + return + var/mob/living/L = target + if(!istype(L) || L.buckled) + return + return TRUE + + +/proc/this_is_an_animal_or_a_robot(atom/movable/target as mob|obj) + return (istype(target, /mob/living/simple_animal) || istype(target, /mob/living/silicon)) + + +/proc/allowed_to_add_this_person_to_a_medical_machine(atom/movable/target as mob|obj, mob/user as mob, obj/target_object as obj, var/occupant) + if(!this_guy_is_allowed_to_drag_that_guy_into_something(target,user,target_object)) + return + if(this_is_an_animal_or_a_robot(target)) + return + if(occupant) + user << "\blue The [target_object] is already occupied!" + return + var/mob/living/L = target + if(L.abiotic()) + user << "\red Subject cannot have abiotic items on." + return + for(var/mob/living/carbon/slime/M in range(1,L)) + if(M.Victim == L) + usr << "\red [L.name] will not fit into the [target_object] because they have a slime latched onto their head." + return + return TRUE \ No newline at end of file diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 2f7a2797..4f8e0846 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -120,6 +120,19 @@ src.add_fingerprint(usr) return + +/obj/machinery/dna_scannernew/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob) + if(!allowed_to_add_this_person_to_a_medical_machine(O,user,src,occupant)) + return + var/mob/living/L = O + if(L == user) + return + visible_message("[user] puts [L.name] into the DNA Scanner.", 3) + put_in(L) + if(user.pulling == L) + user.pulling = null + + /obj/machinery/dna_scannernew/attackby(var/obj/item/weapon/item as obj, var/mob/user as mob) if(istype(item, /obj/item/weapon/reagent_containers/glass)) if(beaker) @@ -829,4 +842,5 @@ return 1 + /////////////////////////// DNA MACHINES diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index b74f9604..d2a7d0e2 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -171,268 +171,298 @@ idle_power_usage = 15 active_power_usage = 200 //builtin health analyzer, dialysis machine, injectors. - New() - ..() - beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large() - spawn( 5 ) - if(orient == "RIGHT") - icon_state = "sleeper_0-r" - return +/obj/machinery/sleeper/New() + ..() + beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large() + spawn( 5 ) + if(orient == "RIGHT") + icon_state = "sleeper_0-r" + return + return + + +/obj/machinery/sleeper/allow_drop() + return 0 + + +/obj/machinery/sleeper/process() + if (stat & (NOPOWER|BROKEN)) return - - allow_drop() - return 0 - - - process() - if (stat & (NOPOWER|BROKEN)) - return - - if(filtering > 0) - if(beaker) - if(beaker.reagents.total_volume < beaker.reagents.maximum_volume) + if(filtering > 0) + if(beaker) + if(beaker.reagents.total_volume < beaker.reagents.maximum_volume) + src.occupant.vessel.trans_to(beaker, 1) + for(var/datum/reagent/x in src.occupant.reagents.reagent_list) + src.occupant.reagents.trans_to(beaker, 3) src.occupant.vessel.trans_to(beaker, 1) - for(var/datum/reagent/x in src.occupant.reagents.reagent_list) - src.occupant.reagents.trans_to(beaker, 3) - src.occupant.vessel.trans_to(beaker, 1) - src.updateUsrDialog() - return + src.updateUsrDialog() + return - blob_act() - if(prob(75)) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - A.blob_act() - del(src) - return +/obj/machinery/sleeper/blob_act() + if(prob(75)) + for(var/atom/movable/A as mob|obj in src) + A.loc = src.loc + A.blob_act() + del(src) + return - attackby(var/obj/item/weapon/G as obj, var/mob/user as mob) - if(istype(G, /obj/item/weapon/reagent_containers/glass)) - if(!beaker) - beaker = G - user.drop_item() - G.loc = src - user.visible_message("[user] adds \a [G] to \the [src]!", "You add \a [G] to \the [src]!") - src.updateUsrDialog() - return - else - user << "\red The sleeper has a beaker already." +/obj/machinery/sleeper/attackby(var/obj/item/weapon/G as obj, var/mob/user as mob) + if(istype(G, /obj/item/weapon/reagent_containers/glass)) + if(!beaker) + beaker = G + user.drop_item() + G.loc = src + user.visible_message("[user] adds \a [G] to \the [src]!", "You add \a [G] to \the [src]!") + src.updateUsrDialog() + return + else + user << "\red The sleeper has a beaker already." + return + + else if(istype(G, /obj/item/weapon/grab)) + if(!ismob(G:affecting)) + return + + if(src.occupant) + user << "\blue The sleeper is already occupied!" + return + + for(var/mob/living/carbon/slime/M in range(1,G:affecting)) + if(M.Victim == G:affecting) + usr << "[G:affecting.name] will not fit into the sleeper because they have a slime latched onto their head." return - else if(istype(G, /obj/item/weapon/grab)) - if(!ismob(G:affecting)) - return + visible_message("[user] starts putting [G:affecting:name] into the sleeper.", 3) + if(do_after(user, 20)) if(src.occupant) user << "\blue The sleeper is already occupied!" return + if(!G || !G:affecting) return + var/mob/M = G:affecting + if(M.client) + M.client.perspective = EYE_PERSPECTIVE + M.client.eye = src + M.loc = src + update_use_power(2) + src.occupant = M + src.icon_state = "sleeper_1" + if(orient == "RIGHT") + icon_state = "sleeper_1-r" - for(var/mob/living/carbon/slime/M in range(1,G:affecting)) - if(M.Victim == G:affecting) - usr << "[G:affecting.name] will not fit into the sleeper because they have a slime latched onto their head." - return - - visible_message("[user] starts putting [G:affecting:name] into the sleeper.", 3) - - if(do_after(user, 20)) - if(src.occupant) - user << "\blue The sleeper is already occupied!" - return - if(!G || !G:affecting) return - var/mob/M = G:affecting - if(M.client) - M.client.perspective = EYE_PERSPECTIVE - M.client.eye = src - M.loc = src - update_use_power(2) - src.occupant = M - src.icon_state = "sleeper_1" - if(orient == "RIGHT") - icon_state = "sleeper_1-r" - - src.add_fingerprint(user) - del(G) - return + src.add_fingerprint(user) + del(G) return + return - ex_act(severity) - if(filtering) - toggle_filter() - switch(severity) - if(1.0) +/obj/machinery/sleeper/ex_act(severity) + if(filtering) + toggle_filter() + switch(severity) + if(1.0) + for(var/atom/movable/A as mob|obj in src) + A.loc = src.loc + ex_act(severity) + del(src) + return + if(2.0) + if(prob(50)) for(var/atom/movable/A as mob|obj in src) A.loc = src.loc ex_act(severity) del(src) return - if(2.0) - if(prob(50)) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - ex_act(severity) - del(src) - return - if(3.0) - if(prob(25)) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - ex_act(severity) - del(src) - return - return - emp_act(severity) - if(filtering) - toggle_filter() - if(stat & (BROKEN|NOPOWER)) - ..(severity) - return - if(occupant) - go_out() - ..(severity) - - alter_health(mob/living/M as mob) - if (M.health > 0) - if (M.getOxyLoss() >= 10) - var/amount = max(0.15, 1) - M.adjustOxyLoss(-amount) - else - M.adjustOxyLoss(-12) - M.updatehealth() - M.AdjustParalysis(-4) - M.AdjustWeakened(-4) - M.AdjustStunned(-4) - M.Paralyse(1) - M.Weaken(1) - M.Stun(1) - if (M:reagents.get_reagent_amount("inaprovaline") < 5) - M:reagents.add_reagent("inaprovaline", 5) - return - proc/toggle_filter() - if(!src.occupant) - filtering = 0 - return - if(filtering) - filtering = 0 - else - filtering = 1 - - proc/go_out() - if(filtering) - toggle_filter() - if(!src.occupant) - return - if(src.occupant.client) - src.occupant.client.eye = src.occupant.client.mob - src.occupant.client.perspective = MOB_PERSPECTIVE - src.occupant.loc = src.loc - src.occupant = null - update_use_power(1) - if(orient == "RIGHT") - icon_state = "sleeper_0-r" - return - - - proc/inject_chemical(mob/living/user as mob, chemical, amount) - if(src.occupant && src.occupant.reagents) - if(src.occupant.reagents.get_reagent_amount(chemical) + amount <= 20) - src.occupant.reagents.add_reagent(chemical, amount) - user << "Occupant now has [src.occupant.reagents.get_reagent_amount(chemical)] units of [available_chemicals[chemical]] in his/her bloodstream." + if(3.0) + if(prob(25)) + for(var/atom/movable/A as mob|obj in src) + A.loc = src.loc + ex_act(severity) + del(src) return - user << "There's no occupant in the sleeper or the subject has too many chemicals!" + return + +/obj/machinery/sleeper/emp_act(severity) + if(filtering) + toggle_filter() + if(stat & (BROKEN|NOPOWER)) + ..(severity) return + if(occupant) + go_out() + ..(severity) - - proc/check(mob/living/user as mob) - if(src.occupant) - user << text("\blue Occupant ([]) Statistics:", src.occupant) - var/t1 - switch(src.occupant.stat) - if(0.0) - t1 = "Conscious" - if(1.0) - t1 = "Unconscious" - if(2.0) - t1 = "*dead*" - else - user << text("[]\t Health %: [] ([])", (src.occupant.health > 50 ? "\blue " : "\red "), src.occupant.health, t1) - user << text("[]\t -Core Temperature: []°C ([]°F)
", (src.occupant.bodytemperature > 50 ? "" : ""), src.occupant.bodytemperature-T0C, src.occupant.bodytemperature*1.8-459.67) - user << text("[]\t -Brute Damage %: []", (src.occupant.getBruteLoss() < 60 ? "\blue " : "\red "), src.occupant.getBruteLoss()) - user << text("[]\t -Respiratory Damage %: []", (src.occupant.getOxyLoss() < 60 ? "\blue " : "\red "), src.occupant.getOxyLoss()) - user << text("[]\t -Toxin Content %: []", (src.occupant.getToxLoss() < 60 ? "\blue " : "\red "), src.occupant.getToxLoss()) - user << text("[]\t -Burn Severity %: []", (src.occupant.getFireLoss() < 60 ? "\blue " : "\red "), src.occupant.getFireLoss()) - user << "\blue Expected time till occupant can safely awake: (note: If health is below 20% these times are inaccurate)" - user << text("\blue \t [] second\s (if around 1 or 2 the sleeper is keeping them asleep.)", src.occupant.paralysis / 5) - if(src.beaker) - user << text("\blue \t Dialysis Output Beaker has [] of free space remaining.", src.beaker.reagents.maximum_volume - src.beaker.reagents.total_volume) - else - user << "\blue No Dialysis Output Beaker loaded." +/obj/machinery/sleeper/alter_health(mob/living/M as mob) + if (M.health > 0) + if (M.getOxyLoss() >= 10) + var/amount = max(0.15, 1) + M.adjustOxyLoss(-amount) else - user << "\blue There is no one inside!" + M.adjustOxyLoss(-12) + M.updatehealth() + M.AdjustParalysis(-4) + M.AdjustWeakened(-4) + M.AdjustStunned(-4) + M.Paralyse(1) + M.Weaken(1) + M.Stun(1) + if (M:reagents.get_reagent_amount("inaprovaline") < 5) + M:reagents.add_reagent("inaprovaline", 5) + return + +/obj/machinery/sleeper/proc/toggle_filter() + if(!src.occupant) + filtering = 0 + return + if(filtering) + filtering = 0 + else + filtering = 1 + +/obj/machinery/sleeper/proc/go_out() + if(filtering) + toggle_filter() + if(!src.occupant) + return + if(src.occupant.client) + src.occupant.client.eye = src.occupant.client.mob + src.occupant.client.perspective = MOB_PERSPECTIVE + src.occupant.loc = src.loc + src.occupant = null + update_use_power(1) + if(orient == "RIGHT") + icon_state = "sleeper_0-r" + return + + +/obj/machinery/sleeper/proc/inject_chemical(mob/living/user as mob, chemical, amount) + if(src.occupant && src.occupant.reagents) + if(src.occupant.reagents.get_reagent_amount(chemical) + amount <= 20) + src.occupant.reagents.add_reagent(chemical, amount) + user << "Occupant now has [src.occupant.reagents.get_reagent_amount(chemical)] units of [available_chemicals[chemical]] in his/her bloodstream." + return + user << "There's no occupant in the sleeper or the subject has too many chemicals!" + return + + +/obj/machinery/sleeper/proc/check(mob/living/user as mob) + if(src.occupant) + user << text("\blue Occupant ([]) Statistics:", src.occupant) + var/t1 + switch(src.occupant.stat) + if(0.0) + t1 = "Conscious" + if(1.0) + t1 = "Unconscious" + if(2.0) + t1 = "*dead*" + else + user << text("[]\t Health %: [] ([])", (src.occupant.health > 50 ? "\blue " : "\red "), src.occupant.health, t1) + user << text("[]\t -Core Temperature: []°C ([]°F)
", (src.occupant.bodytemperature > 50 ? "" : ""), src.occupant.bodytemperature-T0C, src.occupant.bodytemperature*1.8-459.67) + user << text("[]\t -Brute Damage %: []", (src.occupant.getBruteLoss() < 60 ? "\blue " : "\red "), src.occupant.getBruteLoss()) + user << text("[]\t -Respiratory Damage %: []", (src.occupant.getOxyLoss() < 60 ? "\blue " : "\red "), src.occupant.getOxyLoss()) + user << text("[]\t -Toxin Content %: []", (src.occupant.getToxLoss() < 60 ? "\blue " : "\red "), src.occupant.getToxLoss()) + user << text("[]\t -Burn Severity %: []", (src.occupant.getFireLoss() < 60 ? "\blue " : "\red "), src.occupant.getFireLoss()) + user << "\blue Expected time till occupant can safely awake: (note: If health is below 20% these times are inaccurate)" + user << text("\blue \t [] second\s (if around 1 or 2 the sleeper is keeping them asleep.)", src.occupant.paralysis / 5) + if(src.beaker) + user << text("\blue \t Dialysis Output Beaker has [] of free space remaining.", src.beaker.reagents.maximum_volume - src.beaker.reagents.total_volume) + else + user << "\blue No Dialysis Output Beaker loaded." + else + user << "\blue There is no one inside!" + return + + +/obj/machinery/sleeper/verb/eject() + set name = "Eject Sleeper" + set category = "Object" + set src in oview(1) + if(usr.stat != 0) + return + if(orient == "RIGHT") + icon_state = "sleeper_0-r" + src.icon_state = "sleeper_0" + src.go_out() + add_fingerprint(usr) + return + +/obj/machinery/sleeper/verb/remove_beaker() + set name = "Remove Beaker" + set category = "Object" + set src in oview(1) + if(usr.stat != 0) + return + if(beaker) + filtering = 0 + beaker.loc = usr.loc + beaker = null + add_fingerprint(usr) + return + +/obj/machinery/sleeper/verb/move_inside() + set name = "Enter Sleeper" + set category = "Object" + set src in oview(1) + + if(usr.stat != 0 || !(ishuman(usr) || ismonkey(usr))) return - - verb/eject() - set name = "Eject Sleeper" - set category = "Object" - set src in oview(1) - if(usr.stat != 0) - return - if(orient == "RIGHT") - icon_state = "sleeper_0-r" - src.icon_state = "sleeper_0" - src.go_out() - add_fingerprint(usr) + if(src.occupant) + usr << "\blue The sleeper is already occupied!" return - verb/remove_beaker() - set name = "Remove Beaker" - set category = "Object" - set src in oview(1) - if(usr.stat != 0) + for(var/mob/living/carbon/slime/M in range(1,usr)) + if(M.Victim == usr) + usr << "You're too busy getting your life sucked out of you." return - if(beaker) - filtering = 0 - beaker.loc = usr.loc - beaker = null - add_fingerprint(usr) - return - - verb/move_inside() - set name = "Enter Sleeper" - set category = "Object" - set src in oview(1) - - if(usr.stat != 0 || !(ishuman(usr) || ismonkey(usr))) - return - + visible_message("[usr] starts climbing into the sleeper.", 3) + if(do_after(usr, 20)) if(src.occupant) usr << "\blue The sleeper is already occupied!" return + usr.stop_pulling() + usr.client.perspective = EYE_PERSPECTIVE + usr.client.eye = src + usr.loc = src + update_use_power(2) + src.occupant = usr + src.icon_state = "sleeper_1" + if(orient == "RIGHT") + icon_state = "sleeper_1-r" - for(var/mob/living/carbon/slime/M in range(1,usr)) - if(M.Victim == usr) - usr << "You're too busy getting your life sucked out of you." - return - visible_message("[usr] starts climbing into the sleeper.", 3) - if(do_after(usr, 20)) - if(src.occupant) - usr << "\blue The sleeper is already occupied!" - return - usr.stop_pulling() - usr.client.perspective = EYE_PERSPECTIVE - usr.client.eye = src - usr.loc = src - update_use_power(2) - src.occupant = usr - src.icon_state = "sleeper_1" - if(orient == "RIGHT") - icon_state = "sleeper_1-r" - - for(var/obj/O in src) - del(O) - src.add_fingerprint(usr) - return + for(var/obj/O in src) + del(O) + src.add_fingerprint(usr) return + return + + +/obj/machinery/sleeper/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob) + if(!allowed_to_add_this_person_to_a_medical_machine(O,user,src,occupant)) + return + var/mob/living/L = O + if(L == user) + visible_message("[user] starts climbing into the sleeper.", 3) + else + visible_message("[user] starts putting [L.name] into the sleeper.", 3) + if(do_after(user, 20)) + if(src.occupant) + user << "\blue The sleeper is already occupied!" + return + if(!L) return + + if(L.client) + L.client.perspective = EYE_PERSPECTIVE + L.client.eye = src + L.loc = src + src.occupant = L + src.icon_state = (orient == "RIGHT") ? "sleeper_1-r" : "sleeper_1" + L << "\blue You feel cool air surround you. You go numb as your senses turn inward." + src.add_fingerprint(user) + if(user.pulling == L) + user.pulling = null + return + return \ No newline at end of file diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 16b21a59..fc6d27e5 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -14,8 +14,23 @@ idle_power_usage = 60 active_power_usage = 10000 //10 kW. It's a big all-body scanner. -/*/obj/machinery/bodyscanner/allow_drop() - return 0*/ + +/obj/machinery/bodyscanner/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob) + if(!allowed_to_add_this_person_to_a_medical_machine(O,user,src,occupant)) + return + var/mob/living/L = O + if(L == user) + visible_message("[user] climbs into the body scanner.", 3) + else + visible_message("[user] puts [L.name] into the body scanner.", 3) + if (L.client) + L.client.perspective = EYE_PERSPECTIVE + L.client.eye = src + L.loc = src + src.occupant = L + src.icon_state = "body_scanner_1" + src.add_fingerprint(user) + return /obj/machinery/bodyscanner/relaymove(mob/user as mob) if (user.stat) diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 32ecb748..2c54faed 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -32,6 +32,20 @@ node = target break + +/obj/machinery/atmospherics/unary/cryo_cell/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob) + if(!allowed_to_add_this_person_to_a_medical_machine(O,user,src,occupant)) + return + var/mob/living/L = O + if(put_mob(L)) + if(L == user) + visible_message("[user] climbs into the cryo cell.", 3) + else + visible_message("[user] puts [L.name] into the cryo cell.", 3) + if(user.pulling == L) + user.pulling = null + + /obj/machinery/atmospherics/unary/cryo_cell/process() ..() if(!node) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 7143e381..766749e3 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -144,6 +144,7 @@ var/global/list/frozen_items = list() desc = "A man-sized pod for entering suspended animation." icon = 'icons/obj/Cryogenic2.dmi' icon_state = "body_scanner_0" + var/occupied_icon_state = "body_scanner_1" density = 1 anchored = 1 @@ -288,7 +289,6 @@ var/global/list/frozen_items = list() del(occupant) occupant = null - return @@ -327,9 +327,9 @@ var/global/list/frozen_items = list() M.client.eye = src if(orient_right) - icon_state = "body_scanner_1-r" + icon_state = "[occupied_icon_state]-r" else - icon_state = "body_scanner_1" + icon_state = occupied_icon_state M << "\blue You feel cool air surround you. You go numb as your senses turn inward." M << "\blue If you ghost, log out or close your client now, your character will shortly be permanently removed from the round." @@ -345,6 +345,72 @@ var/global/list/frozen_items = list() //Despawning occurs when process() is called with an occupant without a client. src.add_fingerprint(M) + + +/obj/machinery/cryopod/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob) + if(!allowed_to_add_this_person_to_a_medical_machine(O,user,src,occupant)) + return + + var/mob/living/L = O + + if(L.stat == DEAD) + user << "Dead people can not be put into cryo." + return + + for(var/mob/living/carbon/slime/M in range(1,L)) + if(M.Victim == L) + usr << "[L.name] will not fit into the cryo pod because they have a slime latched onto their head." + return + + var/willing = null //We don't want to allow people to be forced into despawning. + + if(L.client) + if(alert(L,"Would you like to enter cryosleep?",,"Yes","No") == "Yes") + if(!L) return + willing = 1 + else + willing = 1 + + if(willing) + if(L == user) + visible_message("[user] starts climbing into the cryo pod.", 3) + else + visible_message("[user] starts putting [L] into the cryo pod.", 3) + + if(do_after(user, 20)) + if(!L) return + + L.loc = src + + if(L.client) + L.client.perspective = EYE_PERSPECTIVE + L.client.eye = src + else + user << "You stop [L == user ? "climbing into the cryo pod." : "putting [L] into the cryo pod."]" + return + + if(orient_right) + icon_state = "[occupied_icon_state]-r" + else + icon_state = occupied_icon_state + + L << "\blue You feel cool air surround you. You go numb as your senses turn inward." + L << "\blue If you ghost, log out or close your client now, your character will shortly be permanently removed from the round." + occupant = L + time_entered = world.time + + // Book keeping! + var/turf/location = get_turf(src) + log_admin("[key_name_admin(L)] has entered a stasis pod.") + message_admins("\blue [key_name_admin(L)] has entered a stasis pod.(JMP)") + message_mods("\blue [key_name_admin(L)] has entered a stasis pod.(JMP)") + + //Despawning occurs when process() is called with an occupant without a client. + src.add_fingerprint(L) + + return + + /obj/machinery/cryopod/verb/eject() set name = "Eject Pod" diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 8165a4eb..ba841e52 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -349,8 +349,8 @@ if ((!( istype(O, /obj/item/weapon) ) || user.get_active_hand() != O)) return ..() - if(isrobot(user)) - return + if(istype(user, /mob/living/silicon/robot/drone)) // drones don't get to table people + return ..() user.drop_item() if (O.loc != src.loc) step(O, get_dir(O, src))