diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 3d39410bce4..f16bfc65334 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -75,13 +75,36 @@ return 0 -/obj/machinery/optable/MouseDrop_T(obj/O as obj, mob/user as mob) +/obj/machinery/optable/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob) - if ((!( istype(O, /obj/item/weapon) ) || user.get_active_hand() != O)) + if(O.loc == user) //no you can't pull things out of your ass return - user.drop_item() - if (O.loc != src.loc) - step(O, get_dir(O, src)) + if(user.restrained() || user.stat || user.weakened || user.stunned || user.paralysis || user.resting) //are you cuffed, dying, lying, stunned or other + return + if(O.anchored || get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src)) // is the mob anchored, too far away from you, or are you too far away from the source + return + if(!ismob(O)) //humans only + return + if(istype(O, /mob/living/simple_animal) || istype(O, /mob/living/silicon)) //animals and robutts dont fit + return + if(!ishuman(user) && !isrobot(user)) //No ghosts or mice putting people into the sleeper + 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(O.loc, /turf)) // are you in a container/closet/pod/etc? + return + var/mob/living/L = O + if(!istype(L) || L.buckled) + return + for(var/mob/living/carbon/slime/M in range(1,L)) + if(M.Victim == L) + usr << "[L.name] cannot be operated on while they have \a [M] attached to their head!" + return + if(src.victim) + usr << "\blue The table is already occupied!" + return + + take_victim(L, user) return /obj/machinery/optable/proc/check_victim() diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 4f91b933fbb..3a510151f20 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -50,6 +50,11 @@ icon_state = "grey" _color = "grey" can_label = 0 +/obj/machinery/portable_atmospherics/canister/custom_mix + name = "Canister \[Custom\]" + icon_state = "whiters" + _color = "whiters" + can_label = 0 /obj/machinery/portable_atmospherics/canister/proc/check_change() var/old_flag = update_flag @@ -332,6 +337,7 @@ update_flag "\[CO2\]" = "black", \ "\[Air\]" = "grey", \ "\[CAUTION\]" = "yellow", \ + "\[Custom\]" = "whiters",\ ) var/label = input("Choose canister label", "Gas canister") as null|anything in colors if (label) @@ -421,6 +427,12 @@ update_flag src.update_icon() return 1 +/obj/machinery/portable_atmospherics/canister/custom_mix/New() + ..() + + src.update_icon() // Otherwise new canisters do not have their icon updated with the pressure light, likely want to add this to the canister class constructor, avoiding at current time to refrain from screwing up code for other canisters. --DZD + return 1 + /obj/machinery/portable_atmospherics/canister/proc/weld(var/obj/item/weapon/weldingtool/WT, var/mob/user) if(busy) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 5246d97e321..5cf1a6f04ce 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -240,7 +240,7 @@ obj/machinery/computer/cryopod/Topic(href, href_list) current_mode.possible_traitors.Remove(occupant) // Delete them from datacore. - + if(PDA_Manifest.len) PDA_Manifest.Cut() for(var/datum/data/record/R in data_core.medical) @@ -328,6 +328,82 @@ obj/machinery/computer/cryopod/Topic(href, href_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(O.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(O.anchored || get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src)) // is the mob anchored, too far away from you, or are you too far away from the source + return + if(!ismob(O)) //humans only + return + if(istype(O, /mob/living/simple_animal) || istype(O, /mob/living/silicon)) //animals and robutts dont fit + return + if(!ishuman(user) && !isrobot(user)) //No ghosts or mice putting people into the sleeper + 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(O.loc, /turf)) // are you in a container/closet/pod/etc? + return + if(occupant) + user << "\blue The cryo pod is already occupied!" + return + + + var/mob/living/L = O + if(!istype(L) || L.buckled) + 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 + + if(orient_right) + icon_state = "body_scanner_1-r" + else + icon_state = "body_scanner_1" + + 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! + log_admin("[key_name_admin(L)] has entered a stasis pod.") + message_admins("\blue [key_name_admin(L)] has entered a stasis pod.") + + //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" set category = "Object" diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 1e81e53bdd0..d732b5b1b07 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -52,11 +52,11 @@ for(var/obj/O in range(0, src)) if(O.density == 1 && O != src && !istype(O, /obj/machinery/door/window)) //Ignores windoors, as those already block climbing, otherwise a windoor on the opposite side of a table would prevent climbing. - user << "\red You cannot climb a [src] blocked by a solid object!" + user << "\red You cannot climb [src], as it is blocked by \a [O]!" return for(var/turf/T in range(0, src)) if(T.density == 1) - user << "\red You cannot climb a [src] blocked by a solid object!" + user << "\red You cannot climb [src], as it is blocked by \a [T]!" return var/turf/T = src.loc if(!T || !istype(T)) return diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index dff5bde016f..71a9f799e48 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -217,7 +217,7 @@ BLIND // can't see anything min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECITON_TEMPERATURE siemens_coefficient = 0.9 species_restricted = list("exclude","Diona","Vox") - loose = 1 // very rarely falls off + loose = 0 // What kind of idiot designs a pressurized suit where the helmet can fall off? /obj/item/clothing/suit/space name = "Space suit" diff --git a/code/modules/clothing/spacesuits/ninja.dm b/code/modules/clothing/spacesuits/ninja.dm index ba453b40507..cee905cb906 100644 --- a/code/modules/clothing/spacesuits/ninja.dm +++ b/code/modules/clothing/spacesuits/ninja.dm @@ -6,7 +6,6 @@ allowed = list(/obj/item/weapon/cell) armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 25) siemens_coefficient = 0.2 - loose = 0 /obj/item/clothing/suit/space/space_ninja diff --git a/icons/obj/atmos.dmi b/icons/obj/atmos.dmi index a80de32c0c6..efe3ad114f4 100644 Binary files a/icons/obj/atmos.dmi and b/icons/obj/atmos.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 5b9521e089f..92950367876 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ