Merge pull request #4354 from Citadel-Station-13/upstream-merge-33465
[MIRROR] Replaces a bunch of loc assignments with forcemoves and moves to nullspace
This commit is contained in:
@@ -14,7 +14,7 @@
|
||||
|
||||
// Otherwise jump
|
||||
else if(A.loc)
|
||||
loc = get_turf(A)
|
||||
forceMove(get_turf(A))
|
||||
update_parallax_contents()
|
||||
|
||||
/mob/dead/observer/ClickOn(var/atom/A, var/params)
|
||||
|
||||
@@ -200,7 +200,7 @@
|
||||
loc.handle_atom_del(src)
|
||||
for(var/atom/movable/AM in contents)
|
||||
qdel(AM)
|
||||
loc = null
|
||||
moveToNullspace()
|
||||
invisibility = INVISIBILITY_ABSTRACT
|
||||
if(pulledby)
|
||||
pulledby.stop_pulling()
|
||||
@@ -268,31 +268,14 @@
|
||||
//If no destination, move the atom into nullspace (don't do this unless you know what you're doing)
|
||||
else
|
||||
. = TRUE
|
||||
var/atom/oldloc = loc
|
||||
var/area/old_area = get_area(oldloc)
|
||||
oldloc.Exited(src, null)
|
||||
if(old_area)
|
||||
old_area.Exited(src, null)
|
||||
if (loc)
|
||||
var/atom/oldloc = loc
|
||||
var/area/old_area = get_area(oldloc)
|
||||
oldloc.Exited(src, null)
|
||||
if(old_area)
|
||||
old_area.Exited(src, null)
|
||||
loc = null
|
||||
|
||||
/mob/living/forceMove(atom/destination)
|
||||
stop_pulling()
|
||||
if(buckled)
|
||||
buckled.unbuckle_mob(src, force = TRUE)
|
||||
if(has_buckled_mobs())
|
||||
unbuckle_all_mobs(force = TRUE)
|
||||
. = ..()
|
||||
if(.)
|
||||
if(client)
|
||||
reset_perspective(destination)
|
||||
update_canmove() //if the mob was asleep inside a container and then got forceMoved out we need to make them fall.
|
||||
|
||||
/mob/living/brain/forceMove(atom/destination)
|
||||
if(container)
|
||||
return container.forceMove(destination)
|
||||
else //something went very wrong.
|
||||
CRASH("Brainmob without container.")
|
||||
|
||||
//Called whenever an object moves and by mobs when they attempt to move themselves through space
|
||||
//And when an object or action applies a force on src, see newtonian_move() below
|
||||
//Return 0 to have src start/keep drifting in a no-grav area and 1 to stop/not start drifting
|
||||
|
||||
@@ -225,7 +225,7 @@
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
for(var/mob/M in contents)
|
||||
src.visible_message("<span class='warning'>[src] hatches!</span>")
|
||||
M.loc = src.loc
|
||||
M.forceMove(drop_location())
|
||||
qdel(src)
|
||||
|
||||
|
||||
|
||||
@@ -14,9 +14,8 @@
|
||||
/obj/machinery/bluespace_beacon/Initialize()
|
||||
. = ..()
|
||||
var/turf/T = loc
|
||||
Beacon = new /obj/item/device/radio/beacon
|
||||
Beacon = new(T)
|
||||
Beacon.invisibility = INVISIBILITY_MAXIMUM
|
||||
Beacon.loc = T
|
||||
|
||||
hide(T.intact)
|
||||
|
||||
@@ -42,13 +41,9 @@
|
||||
/obj/machinery/bluespace_beacon/process()
|
||||
if(!Beacon)
|
||||
var/turf/T = loc
|
||||
Beacon = new /obj/item/device/radio/beacon
|
||||
Beacon = new(T)
|
||||
Beacon.invisibility = INVISIBILITY_MAXIMUM
|
||||
Beacon.forceMove(T)
|
||||
if(Beacon)
|
||||
if(Beacon.loc != loc)
|
||||
Beacon.forceMove(loc)
|
||||
else if (Beacon.loc != loc)
|
||||
Beacon.forceMove(loc)
|
||||
|
||||
updateicon()
|
||||
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
if(!QDELETED(C))
|
||||
qdel(circuit)
|
||||
circuit = C
|
||||
C.loc = null
|
||||
C.moveToNullspace()
|
||||
|
||||
/obj/machinery/computer/Destroy()
|
||||
QDEL_NULL(circuit)
|
||||
|
||||
@@ -154,7 +154,10 @@
|
||||
if(!isturf(eye_user.loc))
|
||||
return
|
||||
T = get_turf(T)
|
||||
loc = T
|
||||
if (T)
|
||||
forceMove(T)
|
||||
else
|
||||
moveToNullspace()
|
||||
if(use_static)
|
||||
GLOB.cameranet.visibility(src)
|
||||
if(visible_icon)
|
||||
|
||||
@@ -46,8 +46,7 @@
|
||||
screen = 2
|
||||
spark_system.set_up(5, 0, src)
|
||||
src.spark_system.start()
|
||||
var/obj/item/paper/monitorkey/MK = new/obj/item/paper/monitorkey
|
||||
MK.loc = src.loc
|
||||
var/obj/item/paper/monitorkey/MK = new(loc)
|
||||
// Will help make emagging the console not so easy to get away with.
|
||||
MK.info += "<br><br><font color='red'>�%@%(*$%&(�&?*(%&�/{}</font>"
|
||||
var/time = 100 * length(src.linkedServer.decryptkey)
|
||||
|
||||
@@ -100,7 +100,7 @@
|
||||
else if(inserted_id)
|
||||
switch(href_list["id"])
|
||||
if("eject")
|
||||
inserted_id.loc = get_turf(src)
|
||||
inserted_id.forceMove(drop_location())
|
||||
inserted_id.verb_pickup()
|
||||
inserted_id = null
|
||||
if("reset")
|
||||
|
||||
@@ -237,7 +237,7 @@
|
||||
user.visible_message("[user] removes the fire alarm assembly from the wall.", \
|
||||
"<span class='notice'>You remove the fire alarm assembly from the wall.</span>")
|
||||
var/obj/item/wallframe/firealarm/frame = new /obj/item/wallframe/firealarm()
|
||||
frame.loc = user.loc
|
||||
frame.forceMove(user.drop_location())
|
||||
playsound(src.loc, W.usesound, 50, 1)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
add_fingerprint(user)
|
||||
if(charging)
|
||||
charging.update_icon()
|
||||
charging.loc = loc
|
||||
charging.forceMove(drop_location())
|
||||
user.put_in_hands(charging)
|
||||
charging = null
|
||||
use_power = IDLE_POWER_USE
|
||||
@@ -91,7 +91,7 @@
|
||||
/obj/machinery/recharger/attack_tk(mob/user)
|
||||
if(charging)
|
||||
charging.update_icon()
|
||||
charging.loc = loc
|
||||
charging.forceMove(drop_location())
|
||||
charging = null
|
||||
use_power = IDLE_POWER_USE
|
||||
update_icon()
|
||||
|
||||
@@ -748,7 +748,7 @@
|
||||
icon_state = initial(icon_state)
|
||||
occupant = pilot_mob
|
||||
pilot_mob.mecha = src
|
||||
pilot_mob.loc = src
|
||||
pilot_mob.forceMove(src)
|
||||
GrantActions(pilot_mob)//needed for checks, and incase a badmin puts somebody in the mob
|
||||
|
||||
/obj/mecha/proc/aimob_exit_mech(mob/living/simple_animal/hostile/syndicate/mecha_pilot/pilot_mob)
|
||||
@@ -959,7 +959,7 @@
|
||||
if(istype(mob_container, /obj/item/device/mmi))
|
||||
var/obj/item/device/mmi/mmi = mob_container
|
||||
if(mmi.brainmob)
|
||||
L.loc = mmi
|
||||
L.forceMove(mmi)
|
||||
L.reset_perspective()
|
||||
mmi.mecha = null
|
||||
mmi.update_icon()
|
||||
|
||||
@@ -524,7 +524,7 @@
|
||||
else
|
||||
user.visible_message("[user] removes the advanced scanner module from the [holder].", "<span class='notice'>You remove the scanner module from the [holder].</span>")
|
||||
var/obj/item/I = locate(/obj/item/stock_parts/scanning_module) in holder
|
||||
I.loc = get_turf(holder)
|
||||
I.forceMove(get_turf(holder))
|
||||
holder.icon_state = "gygax10"
|
||||
if(11)
|
||||
if(diff==FORWARD)
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
for(var/i=1, i <= hides, i++)
|
||||
new /obj/item/stack/sheet/animalhide/goliath_hide(loc) //If a goliath-plated ripley gets killed, all the plates drop
|
||||
for(var/atom/movable/A in cargo)
|
||||
A.forceMove(loc)
|
||||
A.forceMove(drop_location())
|
||||
step_rand(A)
|
||||
cargo.Cut()
|
||||
return ..()
|
||||
@@ -130,7 +130,7 @@
|
||||
var/obj/O = locate(href_list["drop_from_cargo"])
|
||||
if(O && O in src.cargo)
|
||||
src.occupant_message("<span class='notice'>You unload [O].</span>")
|
||||
O.forceMove(loc)
|
||||
O.forceMove(drop_location())
|
||||
src.cargo -= O
|
||||
src.log_message("Unloaded [O]. Cargo compartment capacity: [cargo_capacity - src.cargo.len]")
|
||||
return
|
||||
@@ -141,7 +141,7 @@
|
||||
var/obj/O = X
|
||||
if(prob(30/severity))
|
||||
cargo -= O
|
||||
O.forceMove(loc)
|
||||
O.forceMove(drop_location())
|
||||
. = ..()
|
||||
|
||||
/obj/mecha/working/ripley/get_stats_part()
|
||||
@@ -173,7 +173,7 @@
|
||||
if(!user || user.stat != CONSCIOUS || user.loc != src || O.loc != src )
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You successfully pushed [O] out of [src]!</span>")
|
||||
O.loc = loc
|
||||
O.forceMove(drop_location())
|
||||
cargo -= O
|
||||
else
|
||||
if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded.
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
new /obj/effect/particle_effect/smoke/bad(loc)
|
||||
|
||||
for(var/atom/movable/O in src)
|
||||
O.loc = src.loc
|
||||
O.forceMove(drop_location())
|
||||
|
||||
qdel(src)
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
/obj/effect/countdown/proc/attach(atom/A)
|
||||
attached_to = A
|
||||
loc = get_turf(A)
|
||||
forceMove(get_turf(A))
|
||||
|
||||
/obj/effect/countdown/proc/start()
|
||||
if(!started)
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
/obj/effect/temp_visual/point/Initialize(mapload, set_invis = 0)
|
||||
. = ..()
|
||||
var/atom/old_loc = loc
|
||||
loc = get_turf(src)
|
||||
forceMove(get_turf(src))
|
||||
pixel_x = old_loc.pixel_x
|
||||
pixel_y = old_loc.pixel_y
|
||||
invisibility = set_invis
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
for(var/I in 1 to old_checkers_len)
|
||||
if(I <= old_checkers_used)
|
||||
var/obj/effect/abstract/proximity_checker/pc = checkers_local[I]
|
||||
pc.loc = turfs[I]
|
||||
pc.forceMove(turfs[I])
|
||||
else
|
||||
qdel(checkers_local[I]) //delete the leftovers
|
||||
|
||||
|
||||
@@ -121,7 +121,7 @@
|
||||
|
||||
/obj/structure/spider/spiderling/Collide(atom/user)
|
||||
if(istype(user, /obj/structure/table))
|
||||
src.loc = user.loc
|
||||
forceMove(user.loc)
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -145,7 +145,7 @@
|
||||
"<span class='italics'>You hear something scampering through the ventilation ducts.</span>")
|
||||
|
||||
spawn(rand(20,60))
|
||||
loc = exit_vent
|
||||
forceMove(exit_vent)
|
||||
var/travel_time = round(get_dist(loc, exit_vent.loc) / 2)
|
||||
spawn(travel_time)
|
||||
|
||||
@@ -159,7 +159,7 @@
|
||||
sleep(travel_time)
|
||||
|
||||
if(!exit_vent || exit_vent.welded)
|
||||
loc = entry_vent
|
||||
forceMove(entry_vent)
|
||||
entry_vent = null
|
||||
return
|
||||
loc = exit_vent.loc
|
||||
|
||||
@@ -119,7 +119,7 @@
|
||||
/obj/item/airlock_painter/attack_self(mob/user)
|
||||
if(ink)
|
||||
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
|
||||
ink.loc = user.loc
|
||||
ink.forceMove(user.drop_location())
|
||||
user.put_in_hands(ink)
|
||||
to_chat(user, "<span class='notice'>You remove [ink] from [src].</span>")
|
||||
ink = null
|
||||
|
||||
@@ -35,7 +35,7 @@ micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells.
|
||||
return
|
||||
|
||||
M.component_parts = list(src) // List of components always contains a board
|
||||
loc = null
|
||||
moveToNullspace()
|
||||
|
||||
for(var/comp_path in req_components)
|
||||
var/comp_amt = req_components[comp_path]
|
||||
|
||||
@@ -302,7 +302,7 @@
|
||||
..()
|
||||
if(check_defib_exists(mainunit, src) && req_defib)
|
||||
defib = mainunit
|
||||
loc = defib
|
||||
forceMove(defib)
|
||||
busy = FALSE
|
||||
update_icon()
|
||||
|
||||
|
||||
@@ -292,7 +292,7 @@
|
||||
def_zone = pick("l_leg", "r_leg")
|
||||
if(!C.legcuffed && C.get_num_legs() >= 2) //beartrap can't cuff your leg if there's already a beartrap or legcuffs, or you don't have two legs.
|
||||
C.legcuffed = src
|
||||
src.loc = C
|
||||
forceMove(C)
|
||||
C.update_inv_legcuffed()
|
||||
SSblackbox.record_feedback("tally", "handcuffs", 1, type)
|
||||
else if(isanimal(L))
|
||||
@@ -352,7 +352,7 @@
|
||||
if(!C.legcuffed && C.get_num_legs() >= 2)
|
||||
visible_message("<span class='danger'>\The [src] ensnares [C]!</span>")
|
||||
C.legcuffed = src
|
||||
src.loc = C
|
||||
forceMove(C)
|
||||
C.update_inv_legcuffed()
|
||||
SSblackbox.record_feedback("tally", "handcuffs", 1, type)
|
||||
to_chat(C, "<span class='userdanger'>\The [src] ensnares you!</span>")
|
||||
|
||||
@@ -1,97 +1,97 @@
|
||||
/obj/item/implant
|
||||
name = "implant"
|
||||
icon = 'icons/obj/implants.dmi'
|
||||
icon_state = "generic" //Shows up as the action button icon
|
||||
actions_types = list(/datum/action/item_action/hands_free/activate)
|
||||
var/activated = 1 //1 for implant types that can be activated, 0 for ones that are "always on" like mindshield implants
|
||||
var/mob/living/imp_in = null
|
||||
item_color = "b"
|
||||
var/allow_multiple = FALSE
|
||||
var/uses = -1
|
||||
flags_1 = DROPDEL_1
|
||||
|
||||
|
||||
/obj/item/implant/proc/trigger(emote, mob/living/carbon/source)
|
||||
return
|
||||
|
||||
/obj/item/implant/proc/activate()
|
||||
return
|
||||
|
||||
/obj/item/implant/ui_action_click()
|
||||
activate("action_button")
|
||||
|
||||
/obj/item/implant/proc/can_be_implanted_in(mob/living/target) // for human-only and other special requirements
|
||||
return TRUE
|
||||
|
||||
/mob/living/proc/can_be_implanted()
|
||||
return TRUE
|
||||
|
||||
/mob/living/silicon/can_be_implanted()
|
||||
return FALSE
|
||||
|
||||
/mob/living/simple_animal/can_be_implanted()
|
||||
return healable //Applies to robots and most non-organics, exceptions can override.
|
||||
|
||||
|
||||
|
||||
//What does the implant do upon injection?
|
||||
//return 1 if the implant injects
|
||||
//return 0 if there is no room for implant / it fails
|
||||
/obj/item/implant/proc/implant(mob/living/target, mob/user, silent = 0)
|
||||
LAZYINITLIST(target.implants)
|
||||
if(!target.can_be_implanted() || !can_be_implanted_in(target))
|
||||
return 0
|
||||
for(var/X in target.implants)
|
||||
if(istype(X, type))
|
||||
var/obj/item/implant/imp_e = X
|
||||
if(!allow_multiple)
|
||||
if(imp_e.uses < initial(imp_e.uses)*2)
|
||||
if(uses == -1)
|
||||
imp_e.uses = -1
|
||||
else
|
||||
imp_e.uses = min(imp_e.uses + uses, initial(imp_e.uses)*2)
|
||||
qdel(src)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
src.loc = target
|
||||
imp_in = target
|
||||
target.implants += src
|
||||
if(activated)
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
A.Grant(target)
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
H.sec_hud_set_implants()
|
||||
|
||||
if(user)
|
||||
add_logs(user, target, "implanted", object="[name]")
|
||||
|
||||
return 1
|
||||
|
||||
/obj/item/implant/proc/removed(mob/living/source, silent = 0, special = 0)
|
||||
src.loc = null
|
||||
imp_in = null
|
||||
source.implants -= src
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
A.Grant(source)
|
||||
if(ishuman(source))
|
||||
var/mob/living/carbon/human/H = source
|
||||
H.sec_hud_set_implants()
|
||||
|
||||
return 1
|
||||
|
||||
/obj/item/implant/Destroy()
|
||||
if(imp_in)
|
||||
removed(imp_in)
|
||||
return ..()
|
||||
|
||||
/obj/item/implant/proc/get_data()
|
||||
return "No information available"
|
||||
|
||||
/obj/item/implant/dropped(mob/user)
|
||||
. = 1
|
||||
..()
|
||||
/obj/item/implant
|
||||
name = "implant"
|
||||
icon = 'icons/obj/implants.dmi'
|
||||
icon_state = "generic" //Shows up as the action button icon
|
||||
actions_types = list(/datum/action/item_action/hands_free/activate)
|
||||
var/activated = 1 //1 for implant types that can be activated, 0 for ones that are "always on" like mindshield implants
|
||||
var/mob/living/imp_in = null
|
||||
item_color = "b"
|
||||
var/allow_multiple = FALSE
|
||||
var/uses = -1
|
||||
flags_1 = DROPDEL_1
|
||||
|
||||
|
||||
/obj/item/implant/proc/trigger(emote, mob/living/carbon/source)
|
||||
return
|
||||
|
||||
/obj/item/implant/proc/activate()
|
||||
return
|
||||
|
||||
/obj/item/implant/ui_action_click()
|
||||
activate("action_button")
|
||||
|
||||
/obj/item/implant/proc/can_be_implanted_in(mob/living/target) // for human-only and other special requirements
|
||||
return TRUE
|
||||
|
||||
/mob/living/proc/can_be_implanted()
|
||||
return TRUE
|
||||
|
||||
/mob/living/silicon/can_be_implanted()
|
||||
return FALSE
|
||||
|
||||
/mob/living/simple_animal/can_be_implanted()
|
||||
return healable //Applies to robots and most non-organics, exceptions can override.
|
||||
|
||||
|
||||
|
||||
//What does the implant do upon injection?
|
||||
//return 1 if the implant injects
|
||||
//return 0 if there is no room for implant / it fails
|
||||
/obj/item/implant/proc/implant(mob/living/target, mob/user, silent = 0)
|
||||
LAZYINITLIST(target.implants)
|
||||
if(!target.can_be_implanted() || !can_be_implanted_in(target))
|
||||
return 0
|
||||
for(var/X in target.implants)
|
||||
if(istype(X, type))
|
||||
var/obj/item/implant/imp_e = X
|
||||
if(!allow_multiple)
|
||||
if(imp_e.uses < initial(imp_e.uses)*2)
|
||||
if(uses == -1)
|
||||
imp_e.uses = -1
|
||||
else
|
||||
imp_e.uses = min(imp_e.uses + uses, initial(imp_e.uses)*2)
|
||||
qdel(src)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
forceMove(target)
|
||||
imp_in = target
|
||||
target.implants += src
|
||||
if(activated)
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
A.Grant(target)
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
H.sec_hud_set_implants()
|
||||
|
||||
if(user)
|
||||
add_logs(user, target, "implanted", object="[name]")
|
||||
|
||||
return 1
|
||||
|
||||
/obj/item/implant/proc/removed(mob/living/source, silent = 0, special = 0)
|
||||
moveToNullspace()
|
||||
imp_in = null
|
||||
source.implants -= src
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
A.Grant(source)
|
||||
if(ishuman(source))
|
||||
var/mob/living/carbon/human/H = source
|
||||
H.sec_hud_set_implants()
|
||||
|
||||
return 1
|
||||
|
||||
/obj/item/implant/Destroy()
|
||||
if(imp_in)
|
||||
removed(imp_in)
|
||||
return ..()
|
||||
|
||||
/obj/item/implant/proc/get_data()
|
||||
return "No information available"
|
||||
|
||||
/obj/item/implant/dropped(mob/user)
|
||||
. = 1
|
||||
..()
|
||||
|
||||
@@ -220,7 +220,7 @@
|
||||
return
|
||||
if(!isturf(src.loc))
|
||||
var/atom/target = src.loc
|
||||
loc = target.loc
|
||||
forceMove(target.loc)
|
||||
consume_everything(target)
|
||||
else
|
||||
var/turf/T = get_turf(src)
|
||||
|
||||
@@ -216,7 +216,7 @@
|
||||
if(!src.tank)
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You detach \the [thetank] from \the [src].</span>")
|
||||
src.tank.loc = get_turf(user)
|
||||
src.tank.forceMove(user.drop_location())
|
||||
user.put_in_hands(tank)
|
||||
src.tank = null
|
||||
if(!removing)
|
||||
@@ -265,7 +265,7 @@
|
||||
/obj/item/pneumatic_cannon/pie/Initialize()
|
||||
. = ..()
|
||||
allowed_typecache = pie_typecache
|
||||
|
||||
|
||||
/obj/item/pneumatic_cannon/pie/selfcharge
|
||||
automatic = TRUE
|
||||
selfcharge = TRUE
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
/obj/item/target/Move()
|
||||
..()
|
||||
if(pinnedLoc)
|
||||
pinnedLoc.loc = loc
|
||||
pinnedLoc.forceMove(loc)
|
||||
|
||||
/obj/item/target/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/weldingtool))
|
||||
|
||||
@@ -199,7 +199,7 @@
|
||||
else
|
||||
if(S.pulledby)
|
||||
S.pulledby.stop_pulling()
|
||||
S.loc = src
|
||||
S.forceMove(src)
|
||||
|
||||
orient2hud(usr)
|
||||
if(usr.s_active)
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
on = FALSE
|
||||
to_chat(user, "<span class='warning'>You need a free hand to hold the mister!</span>")
|
||||
return
|
||||
noz.loc = user
|
||||
noz.forceMove(user)
|
||||
else
|
||||
//Remove from their hands and put back "into" the tank
|
||||
remove_noz()
|
||||
@@ -124,7 +124,7 @@
|
||||
if(check_tank_exists(parent_tank, src))
|
||||
tank = parent_tank
|
||||
reagents = tank.reagents //This mister is really just a proxy for the tank's reagents
|
||||
loc = tank
|
||||
forceMove(tank)
|
||||
return
|
||||
|
||||
/obj/item/reagent_containers/spray/mister/dropped(mob/user)
|
||||
@@ -146,7 +146,7 @@
|
||||
/obj/item/reagent_containers/spray/mister/Move()
|
||||
..()
|
||||
if(loc != tank.loc)
|
||||
loc = tank.loc
|
||||
forceMove(tank.loc)
|
||||
|
||||
/obj/item/reagent_containers/spray/mister/afterattack(obj/target, mob/user, proximity)
|
||||
if(target.loc == loc) //Safety check so you don't fill your mister with mutagen or something and then blast yourself in the face with it
|
||||
|
||||
@@ -150,7 +150,7 @@
|
||||
/obj/item/roller/robo/deploy_roller(mob/user, atom/location)
|
||||
if(loaded)
|
||||
var/obj/structure/bed/roller/R = loaded
|
||||
R.loc = location
|
||||
R.forceMove(location)
|
||||
user.visible_message("[user] deploys [loaded].", "<span class='notice'>You deploy [loaded].</span>")
|
||||
loaded = null
|
||||
else
|
||||
|
||||
@@ -1,45 +1,45 @@
|
||||
/obj/structure/closet/crate/bin
|
||||
desc = "A trash bin, place your trash here for the janitor to collect."
|
||||
name = "trash bin"
|
||||
icon_state = "largebins"
|
||||
open_sound = 'sound/effects/bin_open.ogg'
|
||||
close_sound = 'sound/effects/bin_close.ogg'
|
||||
anchored = TRUE
|
||||
horizontal = FALSE
|
||||
delivery_icon = null
|
||||
|
||||
/obj/structure/closet/crate/bin/New()
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/obj/structure/closet/crate/bin/update_icon()
|
||||
..()
|
||||
cut_overlays()
|
||||
if(contents.len == 0)
|
||||
add_overlay("largebing")
|
||||
else if(contents.len >= storage_capacity)
|
||||
add_overlay("largebinr")
|
||||
else
|
||||
add_overlay("largebino")
|
||||
|
||||
/obj/structure/closet/crate/bin/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/storage/bag/trash))
|
||||
var/obj/item/storage/bag/trash/T = W
|
||||
to_chat(user, "<span class='notice'>You fill the bag.</span>")
|
||||
for(var/obj/item/O in src)
|
||||
if(T.can_be_inserted(O, 1))
|
||||
O.loc = T
|
||||
T.update_icon()
|
||||
do_animate()
|
||||
else if(istype(W, /obj/item/wrench))
|
||||
anchored = !anchored
|
||||
playsound(src.loc, W.usesound, 75, 1)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/closet/crate/bin/proc/do_animate()
|
||||
playsound(loc, open_sound, 15, 1, -3)
|
||||
flick("animate_largebins", src)
|
||||
spawn(13)
|
||||
playsound(loc, close_sound, 15, 1, -3)
|
||||
update_icon()
|
||||
/obj/structure/closet/crate/bin
|
||||
desc = "A trash bin, place your trash here for the janitor to collect."
|
||||
name = "trash bin"
|
||||
icon_state = "largebins"
|
||||
open_sound = 'sound/effects/bin_open.ogg'
|
||||
close_sound = 'sound/effects/bin_close.ogg'
|
||||
anchored = TRUE
|
||||
horizontal = FALSE
|
||||
delivery_icon = null
|
||||
|
||||
/obj/structure/closet/crate/bin/New()
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/obj/structure/closet/crate/bin/update_icon()
|
||||
..()
|
||||
cut_overlays()
|
||||
if(contents.len == 0)
|
||||
add_overlay("largebing")
|
||||
else if(contents.len >= storage_capacity)
|
||||
add_overlay("largebinr")
|
||||
else
|
||||
add_overlay("largebino")
|
||||
|
||||
/obj/structure/closet/crate/bin/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/storage/bag/trash))
|
||||
var/obj/item/storage/bag/trash/T = W
|
||||
to_chat(user, "<span class='notice'>You fill the bag.</span>")
|
||||
for(var/obj/item/O in src)
|
||||
if(T.can_be_inserted(O, 1))
|
||||
O.forceMove(T)
|
||||
T.update_icon()
|
||||
do_animate()
|
||||
else if(istype(W, /obj/item/wrench))
|
||||
anchored = !anchored
|
||||
playsound(src.loc, W.usesound, 75, 1)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/closet/crate/bin/proc/do_animate()
|
||||
playsound(loc, open_sound, 15, 1, -3)
|
||||
flick("animate_largebins", src)
|
||||
spawn(13)
|
||||
playsound(loc, close_sound, 15, 1, -3)
|
||||
update_icon()
|
||||
|
||||
@@ -301,7 +301,7 @@ GLOBAL_LIST_EMPTY(crematoriums)
|
||||
return
|
||||
if(!ismob(user) || user.lying || user.incapacitated())
|
||||
return
|
||||
O.loc = src.loc
|
||||
O.forceMove(src.loc)
|
||||
if (user != O)
|
||||
visible_message("<span class='warning'>[user] stuffs [O] into [src].</span>")
|
||||
return
|
||||
|
||||
@@ -43,7 +43,7 @@ FLOOR SAFES
|
||||
return
|
||||
if(I.w_class + space <= maxspace)
|
||||
space += I.w_class
|
||||
I.loc = src
|
||||
I.forceMove(src)
|
||||
|
||||
|
||||
/obj/structure/safe/proc/check_unlocked(mob/user, canhear)
|
||||
@@ -97,10 +97,10 @@ FLOOR SAFES
|
||||
if(!ishuman(usr))
|
||||
return
|
||||
var/mob/living/carbon/human/user = usr
|
||||
|
||||
|
||||
if(!user.canUseTopic(src))
|
||||
return
|
||||
|
||||
|
||||
var/canhear = 0
|
||||
if(user.is_holding_item_of_type(/obj/item/clothing/neck/stethoscope))
|
||||
canhear = 1
|
||||
|
||||
@@ -136,7 +136,7 @@
|
||||
last_delay = current_tube.enter_delay(src, next_dir)
|
||||
sleep(last_delay)
|
||||
setDir(next_dir)
|
||||
loc = next_loc // When moving from one tube to another, skip collision and such.
|
||||
forceMove(next_loc) // When moving from one tube to another, skip collision and such.
|
||||
density = current_tube.density
|
||||
|
||||
if(current_tube && current_tube.should_stop_pod(src, next_dir))
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
if(ishuman(user))
|
||||
user.put_in_hands(I)
|
||||
else
|
||||
I.loc = get_turf(src)
|
||||
I.forceMove(drop_location())
|
||||
to_chat(user, "<span class='notice'>You find [I] in the cistern.</span>")
|
||||
w_items -= I.w_class
|
||||
else
|
||||
|
||||
@@ -101,7 +101,7 @@
|
||||
var/obj/structure/sign/poster/P = O
|
||||
P.roll_and_drop(src)
|
||||
else
|
||||
O.loc = src
|
||||
O.forceMove(src)
|
||||
|
||||
/turf/closed/wall/clockwork/devastate_wall()
|
||||
for(var/i in 1 to 2)
|
||||
|
||||
@@ -55,5 +55,5 @@
|
||||
else if(I) // Put the implant in case.
|
||||
var/obj/item/implantcase/case = new(get_turf(C))
|
||||
case.imp = I
|
||||
I.loc = case
|
||||
I.forceMove(case)
|
||||
case.update_icon()
|
||||
|
||||
@@ -115,13 +115,16 @@
|
||||
air_contents.assert_gases(/datum/gas/plasma, /datum/gas/oxygen)
|
||||
var/fuel_moles = air_contents.gases[/datum/gas/plasma][MOLES] + air_contents.gases[/datum/gas/oxygen][MOLES]/6
|
||||
air_contents.garbage_collect()
|
||||
|
||||
var/datum/gas_mixture/bomb_mixture = air_contents.copy()
|
||||
var/strength = 1
|
||||
|
||||
var/turf/ground_zero = get_turf(loc)
|
||||
loc = null
|
||||
|
||||
if(air_contents.temperature > (T0C + 400))
|
||||
if(master)
|
||||
qdel(master)
|
||||
qdel(src)
|
||||
|
||||
if(bomb_mixture.temperature > (T0C + 400))
|
||||
strength = (fuel_moles/15)
|
||||
|
||||
if(strength >=1)
|
||||
@@ -131,10 +134,10 @@
|
||||
else if(strength >=0.2)
|
||||
explosion(ground_zero, -1, 0, 1, 2)
|
||||
else
|
||||
ground_zero.assume_air(air_contents)
|
||||
ground_zero.assume_air(bomb_mixture)
|
||||
ground_zero.hotspot_expose(1000, 125)
|
||||
|
||||
else if(air_contents.temperature > (T0C + 250))
|
||||
else if(bomb_mixture.temperature > (T0C + 250))
|
||||
strength = (fuel_moles/20)
|
||||
|
||||
if(strength >=1)
|
||||
@@ -142,26 +145,23 @@
|
||||
else if (strength >=0.5)
|
||||
explosion(ground_zero, -1, 0, 1, 2)
|
||||
else
|
||||
ground_zero.assume_air(air_contents)
|
||||
ground_zero.assume_air(bomb_mixture)
|
||||
ground_zero.hotspot_expose(1000, 125)
|
||||
|
||||
else if(air_contents.temperature > (T0C + 100))
|
||||
else if(bomb_mixture.temperature > (T0C + 100))
|
||||
strength = (fuel_moles/25)
|
||||
|
||||
if (strength >=1)
|
||||
explosion(ground_zero, -1, 0, round(strength,1), round(strength*3,1))
|
||||
else
|
||||
ground_zero.assume_air(air_contents)
|
||||
ground_zero.assume_air(bomb_mixture)
|
||||
ground_zero.hotspot_expose(1000, 125)
|
||||
|
||||
else
|
||||
ground_zero.assume_air(air_contents)
|
||||
ground_zero.assume_air(bomb_mixture)
|
||||
ground_zero.hotspot_expose(1000, 125)
|
||||
|
||||
air_update_turf()
|
||||
if(master)
|
||||
qdel(master)
|
||||
qdel(src)
|
||||
ground_zero.air_update_turf()
|
||||
|
||||
/obj/item/tank/proc/release() //This happens when the bomb is not welded. Tank contents are just spat out.
|
||||
var/datum/gas_mixture/removed = air_contents.remove(air_contents.total_moles())
|
||||
|
||||
+91
-91
@@ -1,97 +1,97 @@
|
||||
/obj/item/paper/fluff/jobs/cargo/manifest
|
||||
var/order_cost = 0
|
||||
var/order_id = 0
|
||||
var/errors = 0
|
||||
|
||||
var/order_cost = 0
|
||||
var/order_id = 0
|
||||
var/errors = 0
|
||||
|
||||
/obj/item/paper/fluff/jobs/cargo/manifest/New(atom/A, id, cost)
|
||||
..()
|
||||
order_id = id
|
||||
order_cost = cost
|
||||
|
||||
if(prob(MANIFEST_ERROR_CHANCE))
|
||||
errors |= MANIFEST_ERROR_NAME
|
||||
if(prob(MANIFEST_ERROR_CHANCE))
|
||||
errors |= MANIFEST_ERROR_CONTENTS
|
||||
if(prob(MANIFEST_ERROR_CHANCE))
|
||||
errors |= MANIFEST_ERROR_ITEM
|
||||
|
||||
..()
|
||||
order_id = id
|
||||
order_cost = cost
|
||||
|
||||
if(prob(MANIFEST_ERROR_CHANCE))
|
||||
errors |= MANIFEST_ERROR_NAME
|
||||
if(prob(MANIFEST_ERROR_CHANCE))
|
||||
errors |= MANIFEST_ERROR_CONTENTS
|
||||
if(prob(MANIFEST_ERROR_CHANCE))
|
||||
errors |= MANIFEST_ERROR_ITEM
|
||||
|
||||
/obj/item/paper/fluff/jobs/cargo/manifest/proc/is_approved()
|
||||
return stamped && stamped.len && !is_denied()
|
||||
|
||||
return stamped && stamped.len && !is_denied()
|
||||
|
||||
/obj/item/paper/fluff/jobs/cargo/manifest/proc/is_denied()
|
||||
return stamped && ("stamp-deny" in stamped)
|
||||
|
||||
/datum/supply_order
|
||||
var/id
|
||||
var/orderer
|
||||
var/orderer_rank
|
||||
var/orderer_ckey
|
||||
var/reason
|
||||
var/datum/supply_pack/pack
|
||||
|
||||
/datum/supply_order/New(datum/supply_pack/pack, orderer, orderer_rank, orderer_ckey, reason)
|
||||
id = SSshuttle.ordernum++
|
||||
src.pack = pack
|
||||
src.orderer = orderer
|
||||
src.orderer_rank = orderer_rank
|
||||
src.orderer_ckey = orderer_ckey
|
||||
src.reason = reason
|
||||
|
||||
/datum/supply_order/proc/generateRequisition(turf/T)
|
||||
var/obj/item/paper/P = new(T)
|
||||
|
||||
P.name = "requisition form - #[id] ([pack.name])"
|
||||
P.info += "<h2>[station_name()] Supply Requisition</h2>"
|
||||
P.info += "<hr/>"
|
||||
P.info += "Order #[id]<br/>"
|
||||
P.info += "Item: [pack.name]<br/>"
|
||||
P.info += "Access Restrictions: [get_access_desc(pack.access)]<br/>"
|
||||
P.info += "Requested by: [orderer]<br/>"
|
||||
P.info += "Rank: [orderer_rank]<br/>"
|
||||
P.info += "Comment: [reason]<br/>"
|
||||
|
||||
P.update_icon()
|
||||
return P
|
||||
|
||||
/datum/supply_order/proc/generateManifest(obj/structure/closet/crate/C)
|
||||
return stamped && ("stamp-deny" in stamped)
|
||||
|
||||
/datum/supply_order
|
||||
var/id
|
||||
var/orderer
|
||||
var/orderer_rank
|
||||
var/orderer_ckey
|
||||
var/reason
|
||||
var/datum/supply_pack/pack
|
||||
|
||||
/datum/supply_order/New(datum/supply_pack/pack, orderer, orderer_rank, orderer_ckey, reason)
|
||||
id = SSshuttle.ordernum++
|
||||
src.pack = pack
|
||||
src.orderer = orderer
|
||||
src.orderer_rank = orderer_rank
|
||||
src.orderer_ckey = orderer_ckey
|
||||
src.reason = reason
|
||||
|
||||
/datum/supply_order/proc/generateRequisition(turf/T)
|
||||
var/obj/item/paper/P = new(T)
|
||||
|
||||
P.name = "requisition form - #[id] ([pack.name])"
|
||||
P.info += "<h2>[station_name()] Supply Requisition</h2>"
|
||||
P.info += "<hr/>"
|
||||
P.info += "Order #[id]<br/>"
|
||||
P.info += "Item: [pack.name]<br/>"
|
||||
P.info += "Access Restrictions: [get_access_desc(pack.access)]<br/>"
|
||||
P.info += "Requested by: [orderer]<br/>"
|
||||
P.info += "Rank: [orderer_rank]<br/>"
|
||||
P.info += "Comment: [reason]<br/>"
|
||||
|
||||
P.update_icon()
|
||||
return P
|
||||
|
||||
/datum/supply_order/proc/generateManifest(obj/structure/closet/crate/C)
|
||||
var/obj/item/paper/fluff/jobs/cargo/manifest/P = new(C, id, pack.cost)
|
||||
|
||||
var/station_name = (P.errors & MANIFEST_ERROR_NAME) ? new_station_name() : station_name()
|
||||
|
||||
P.name = "shipping manifest - #[id] ([pack.name])"
|
||||
P.info += "<h2>[command_name()] Shipping Manifest</h2>"
|
||||
P.info += "<hr/>"
|
||||
P.info += "Order #[id]<br/>"
|
||||
P.info += "Destination: [station_name]<br/>"
|
||||
P.info += "Item: [pack.name]<br/>"
|
||||
P.info += "Contents: <br/>"
|
||||
P.info += "<ul>"
|
||||
for(var/atom/movable/AM in C.contents - P)
|
||||
if((P.errors & MANIFEST_ERROR_CONTENTS))
|
||||
if(prob(50))
|
||||
P.info += "<li>[AM.name]</li>"
|
||||
else
|
||||
continue
|
||||
P.info += "<li>[AM.name]</li>"
|
||||
P.info += "</ul>"
|
||||
P.info += "<h4>Stamp below to confirm receipt of goods:</h4>"
|
||||
|
||||
P.update_icon()
|
||||
P.loc = C
|
||||
C.manifest = P
|
||||
C.update_icon()
|
||||
|
||||
return P
|
||||
|
||||
/datum/supply_order/proc/generate(turf/T)
|
||||
var/obj/structure/closet/crate/C = pack.generate(T)
|
||||
|
||||
var/station_name = (P.errors & MANIFEST_ERROR_NAME) ? new_station_name() : station_name()
|
||||
|
||||
P.name = "shipping manifest - #[id] ([pack.name])"
|
||||
P.info += "<h2>[command_name()] Shipping Manifest</h2>"
|
||||
P.info += "<hr/>"
|
||||
P.info += "Order #[id]<br/>"
|
||||
P.info += "Destination: [station_name]<br/>"
|
||||
P.info += "Item: [pack.name]<br/>"
|
||||
P.info += "Contents: <br/>"
|
||||
P.info += "<ul>"
|
||||
for(var/atom/movable/AM in C.contents - P)
|
||||
if((P.errors & MANIFEST_ERROR_CONTENTS))
|
||||
if(prob(50))
|
||||
P.info += "<li>[AM.name]</li>"
|
||||
else
|
||||
continue
|
||||
P.info += "<li>[AM.name]</li>"
|
||||
P.info += "</ul>"
|
||||
P.info += "<h4>Stamp below to confirm receipt of goods:</h4>"
|
||||
|
||||
P.update_icon()
|
||||
P.forceMove(C)
|
||||
C.manifest = P
|
||||
C.update_icon()
|
||||
|
||||
return P
|
||||
|
||||
/datum/supply_order/proc/generate(turf/T)
|
||||
var/obj/structure/closet/crate/C = pack.generate(T)
|
||||
var/obj/item/paper/fluff/jobs/cargo/manifest/M = generateManifest(C)
|
||||
|
||||
if(M.errors & MANIFEST_ERROR_ITEM)
|
||||
if(istype(C, /obj/structure/closet/crate/secure) || istype(C, /obj/structure/closet/crate/large))
|
||||
M.errors &= ~MANIFEST_ERROR_ITEM
|
||||
else
|
||||
var/lost = max(round(C.contents.len / 10), 1)
|
||||
while(--lost >= 0)
|
||||
qdel(pick(C.contents))
|
||||
return C
|
||||
|
||||
if(M.errors & MANIFEST_ERROR_ITEM)
|
||||
if(istype(C, /obj/structure/closet/crate/secure) || istype(C, /obj/structure/closet/crate/large))
|
||||
M.errors &= ~MANIFEST_ERROR_ITEM
|
||||
else
|
||||
var/lost = max(round(C.contents.len / 10), 1)
|
||||
while(--lost >= 0)
|
||||
qdel(pick(C.contents))
|
||||
return C
|
||||
|
||||
@@ -271,29 +271,29 @@
|
||||
target_ui = null
|
||||
|
||||
/obj/effect/chronos_cam/relaymove(var/mob/user, direction)
|
||||
if(holder)
|
||||
if(user == holder)
|
||||
if(loc == user)
|
||||
loc = get_turf(user)
|
||||
if(user.client && user.client.eye != src)
|
||||
src.loc = get_turf(user)
|
||||
user.reset_perspective(src)
|
||||
user.set_machine(src)
|
||||
var/atom/step = get_step(src, direction)
|
||||
if(step)
|
||||
if((step.x <= TRANSITIONEDGE) || (step.x >= (world.maxx - TRANSITIONEDGE - 1)) || (step.y <= TRANSITIONEDGE) || (step.y >= (world.maxy - TRANSITIONEDGE - 1)))
|
||||
if(!src.Move(step))
|
||||
src.loc = step
|
||||
else
|
||||
src.loc = step
|
||||
if((x == holder.x) && (y == holder.y) && (z == holder.z))
|
||||
remove_target_ui()
|
||||
loc = user
|
||||
else if(!target_ui)
|
||||
create_target_ui()
|
||||
phase_time = world.time + phase_time_length
|
||||
else
|
||||
if(!holder)
|
||||
qdel(src)
|
||||
return
|
||||
if(user == holder)
|
||||
if(loc == user)
|
||||
forceMove(get_turf(user))
|
||||
if(user.client && user.client.eye != src)
|
||||
src.loc = get_turf(user)
|
||||
user.reset_perspective(src)
|
||||
user.set_machine(src)
|
||||
var/atom/step = get_step(src, direction)
|
||||
if(step)
|
||||
if((step.x <= TRANSITIONEDGE) || (step.x >= (world.maxx - TRANSITIONEDGE - 1)) || (step.y <= TRANSITIONEDGE) || (step.y >= (world.maxy - TRANSITIONEDGE - 1)))
|
||||
if(!src.Move(step))
|
||||
src.loc = step
|
||||
else
|
||||
src.loc = step
|
||||
if((x == holder.x) && (y == holder.y) && (z == holder.z))
|
||||
remove_target_ui()
|
||||
loc = user
|
||||
else if(!target_ui)
|
||||
create_target_ui()
|
||||
phase_time = world.time + phase_time_length
|
||||
|
||||
/obj/effect/chronos_cam/check_eye(mob/user)
|
||||
if(user != holder)
|
||||
|
||||
@@ -276,7 +276,7 @@
|
||||
/obj/item/reagent_containers/food/snacks/Destroy()
|
||||
if(contents)
|
||||
for(var/atom/movable/something in contents)
|
||||
something.loc = get_turf(src)
|
||||
something.forceMove(drop_location())
|
||||
return ..()
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/attack_animal(mob/M)
|
||||
|
||||
@@ -119,7 +119,7 @@
|
||||
else
|
||||
for(var/obj/O in contents)
|
||||
if(sanitize(O.name) == href_list["dispense"])
|
||||
O.loc = src.loc
|
||||
O.forceMove(drop_location())
|
||||
break
|
||||
|
||||
if(href_list["portion"])
|
||||
|
||||
@@ -284,7 +284,7 @@
|
||||
|
||||
/obj/machinery/microwave/proc/dispose()
|
||||
for (var/obj/O in contents)
|
||||
O.loc = src.loc
|
||||
O.forceMove(drop_location())
|
||||
to_chat(usr, "<span class='notice'>You dispose of the microwave contents.</span>")
|
||||
updateUsrDialog()
|
||||
|
||||
|
||||
@@ -178,9 +178,9 @@
|
||||
|
||||
/obj/machinery/processor/proc/empty()
|
||||
for (var/obj/O in src)
|
||||
O.loc = src.loc
|
||||
O.forceMove(drop_location())
|
||||
for (var/mob/M in src)
|
||||
M.loc = src.loc
|
||||
M.forceMove(drop_location())
|
||||
return
|
||||
|
||||
/obj/machinery/processor/slime
|
||||
|
||||
@@ -301,10 +301,10 @@
|
||||
if(S.dried_type == S.type)//if the dried type is the same as the object's type, don't bother creating a whole new item...
|
||||
S.add_atom_colour("#ad7257", FIXED_COLOUR_PRIORITY)
|
||||
S.dry = TRUE
|
||||
S.loc = get_turf(src)
|
||||
S.forceMove(drop_location())
|
||||
else
|
||||
var/dried = S.dried_type
|
||||
new dried(src.loc)
|
||||
new dried(drop_location())
|
||||
qdel(S)
|
||||
return TRUE
|
||||
for(var/obj/item/stack/sheet/wetleather/WL in contents)
|
||||
|
||||
@@ -110,7 +110,7 @@
|
||||
if(istype(inserted_id))
|
||||
if(href_list["choice"] == "eject")
|
||||
to_chat(usr, "<span class='notice'>You eject the ID from [src]'s card slot.</span>")
|
||||
inserted_id.loc = loc
|
||||
inserted_id.forceMove(loc)
|
||||
inserted_id.verb_pickup()
|
||||
inserted_id = null
|
||||
else if(href_list["choice"] == "insert")
|
||||
|
||||
@@ -132,11 +132,11 @@
|
||||
/mob/living/simple_animal/hostile/mining_drone/proc/CollectOre()
|
||||
var/obj/item/ore/O
|
||||
for(O in src.loc)
|
||||
O.loc = src
|
||||
O.forceMove(src)
|
||||
for(var/dir in GLOB.alldirs)
|
||||
var/turf/T = get_step(src,dir)
|
||||
for(O in T)
|
||||
O.loc = src
|
||||
O.forceMove(src)
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/mining_drone/proc/DropOre(message = 1)
|
||||
@@ -148,7 +148,7 @@
|
||||
to_chat(src, "<span class='notice'>You dump your stored ore.</span>")
|
||||
for(var/obj/item/ore/O in contents)
|
||||
contents -= O
|
||||
O.loc = src.loc
|
||||
O.forceMove(drop_location())
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/mining_drone/adjustHealth(amount)
|
||||
|
||||
@@ -100,4 +100,4 @@
|
||||
if(!M)
|
||||
M = new /obj/item/storage/bag/money(src)
|
||||
unload_mineral(M)
|
||||
O.loc = M
|
||||
O.forceMove(M)
|
||||
|
||||
@@ -12,8 +12,8 @@
|
||||
stored_dna.initialize_dna(random_blood_type())
|
||||
if(isturf(loc)) //not spawned in an MMI or brain organ (most likely adminspawned)
|
||||
var/obj/item/organ/brain/OB = new(loc) //we create a new brain organ for it.
|
||||
loc = OB
|
||||
OB.brainmob = src
|
||||
forceMove(OB)
|
||||
|
||||
|
||||
/mob/living/brain/proc/create_dna()
|
||||
@@ -71,3 +71,16 @@
|
||||
var/obj/mecha/M = MMI.mecha
|
||||
if((src == MMI.brainmob) && istype(M))
|
||||
return M.click_action(A,src,params)
|
||||
|
||||
/mob/living/brain/forceMove(atom/destination)
|
||||
if(container)
|
||||
return container.forceMove(destination)
|
||||
else if (istype(loc, /obj/item/organ/brain))
|
||||
var/obj/item/organ/brain/B = loc
|
||||
B.forceMove(destination)
|
||||
else if (istype(destination, /obj/item/organ/brain))
|
||||
doMove(destination)
|
||||
else if (istype(destination, /obj/item/device/mmi))
|
||||
doMove(destination)
|
||||
else
|
||||
CRASH("Brainmob without a container [src] attempted to move to [destination].")
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
if(C.mind && C.mind.has_antag_datum(/datum/antagonist/changeling) && !no_id_transfer) //congrats, you're trapped in a body you don't control
|
||||
if(brainmob && !(C.stat == DEAD || (C.status_flags & FAKEDEATH)))
|
||||
to_chat(brainmob, "<span class = danger>You can't feel your body! You're still just a brain!</span>")
|
||||
loc = C
|
||||
forceMove(C)
|
||||
C.update_hair()
|
||||
return
|
||||
|
||||
|
||||
@@ -1028,3 +1028,15 @@
|
||||
if(mind && mind.linglink)
|
||||
return LINGHIVE_LINK
|
||||
return LINGHIVE_NONE
|
||||
|
||||
/mob/living/forceMove(atom/destination)
|
||||
stop_pulling()
|
||||
if(buckled)
|
||||
buckled.unbuckle_mob(src, force = TRUE)
|
||||
if(has_buckled_mobs())
|
||||
unbuckle_all_mobs(force = TRUE)
|
||||
. = ..()
|
||||
if(.)
|
||||
if(client)
|
||||
reset_perspective(destination)
|
||||
update_canmove() //if the mob was asleep inside a container and then got forceMoved out we need to make them fall.
|
||||
@@ -21,7 +21,10 @@
|
||||
if(!isturf(ai.loc))
|
||||
return
|
||||
T = get_turf(T)
|
||||
loc = T
|
||||
if (T)
|
||||
forceMove(T)
|
||||
else
|
||||
moveToNullspace() // ????
|
||||
if(use_static)
|
||||
GLOB.cameranet.visibility(src)
|
||||
if(ai.client)
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
var/newcardloc = P
|
||||
P = new /obj/item/device/paicard(newcardloc)
|
||||
P.setPersonality(src)
|
||||
loc = P
|
||||
forceMove(P)
|
||||
card = P
|
||||
sradio = new(src)
|
||||
if(!radio)
|
||||
|
||||
@@ -91,7 +91,7 @@
|
||||
"<span class='notice'>You insert the new cell into [src].</span>")
|
||||
else if(istype(I, /obj/item/crowbar) && open && cell)
|
||||
cell.add_fingerprint(usr)
|
||||
cell.loc = loc
|
||||
cell.forceMove(loc)
|
||||
cell = null
|
||||
visible_message("[user] crowbars out the power cell from [src].",
|
||||
"<span class='notice'>You pry the powercell out of [src].</span>")
|
||||
@@ -361,7 +361,7 @@
|
||||
if(!load_mob(AM))
|
||||
return
|
||||
else
|
||||
AM.loc = src
|
||||
AM.forceMove(src)
|
||||
|
||||
load = AM
|
||||
mode = BOT_IDLE
|
||||
@@ -400,7 +400,7 @@
|
||||
unbuckle_all_mobs()
|
||||
|
||||
if(load)
|
||||
load.loc = loc
|
||||
load.forceMove(loc)
|
||||
load.pixel_y = initial(load.pixel_y)
|
||||
load.layer = initial(load.layer)
|
||||
load.plane = initial(load.plane)
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
I.pulledby.stop_pulling()
|
||||
|
||||
I.screen_loc = null // will get moved if inventory is visible
|
||||
I.loc = src
|
||||
I.forceMove(src)
|
||||
I.layer = ABOVE_HUD_LAYER
|
||||
I.plane = ABOVE_HUD_PLANE
|
||||
|
||||
|
||||
@@ -257,7 +257,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
|
||||
I.pulledby.stop_pulling()
|
||||
|
||||
I.screen_loc = null // will get moved if inventory is visible
|
||||
I.loc = src
|
||||
I.forceMove(src)
|
||||
I.equipped(src, slot)
|
||||
I.layer = ABOVE_HUD_LAYER
|
||||
I.plane = ABOVE_HUD_PLANE
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
|
||||
|
||||
/obj/guardian_bomb/proc/disguise(obj/A)
|
||||
A.loc = src
|
||||
A.forceMove(src)
|
||||
stored_obj = A
|
||||
opacity = A.opacity
|
||||
anchored = A.anchored
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
else if(mind) // Let's make this a feature
|
||||
egg.origin = mind
|
||||
for(var/obj/item/organ/I in src)
|
||||
I.loc = egg
|
||||
I.forceMove(egg)
|
||||
visible_message("<span class='warning'>[src] plants something in [victim]'s flesh!</span>", \
|
||||
"<span class='danger'>We inject our egg into [victim]'s body!</span>")
|
||||
egg_lain = 1
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
. = ..()
|
||||
if(mapload) //eat shit
|
||||
for(var/obj/item/I in loc)
|
||||
I.loc = src
|
||||
I.forceMove(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/mimic/crate/DestroyPathToTarget()
|
||||
..()
|
||||
@@ -89,7 +89,7 @@
|
||||
var/obj/structure/closet/crate/C = new(get_turf(src))
|
||||
// Put loot in crate
|
||||
for(var/obj/O in src)
|
||||
O.loc = C
|
||||
O.forceMove(C)
|
||||
..()
|
||||
|
||||
GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/cable, /obj/structure/window))
|
||||
@@ -116,7 +116,7 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
|
||||
|
||||
/mob/living/simple_animal/hostile/mimic/copy/death()
|
||||
for(var/atom/movable/M in src)
|
||||
M.loc = get_turf(src)
|
||||
M.forceMove(get_turf(src))
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/mimic/copy/ListTargets()
|
||||
@@ -136,7 +136,7 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
|
||||
|
||||
/mob/living/simple_animal/hostile/mimic/copy/proc/CopyObject(obj/O, mob/living/user, destroy_original = 0)
|
||||
if(destroy_original || CheckObject(O))
|
||||
O.loc = src
|
||||
O.forceMove(src)
|
||||
name = O.name
|
||||
desc = O.desc
|
||||
icon = O.icon
|
||||
@@ -249,15 +249,15 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
|
||||
..()
|
||||
else
|
||||
visible_message("<span class='danger'>The <b>[src]</b> clears a jam!</span>")
|
||||
Pewgun.chambered.loc = loc //rip revolver immersions, blame shotgun snowflake procs
|
||||
Pewgun.chambered.forceMove(loc) //rip revolver immersions, blame shotgun snowflake procs
|
||||
Pewgun.chambered = null
|
||||
if(Pewgun.magazine && Pewgun.magazine.stored_ammo.len)
|
||||
Pewgun.chambered = Pewgun.magazine.get_round(0)
|
||||
Pewgun.chambered.loc = Pewgun
|
||||
Pewgun.chambered.forceMove(Pewgun)
|
||||
Pewgun.update_icon()
|
||||
else if(Pewgun.magazine && Pewgun.magazine.stored_ammo.len) //only true for pumpguns i think
|
||||
Pewgun.chambered = Pewgun.magazine.get_round(0)
|
||||
Pewgun.chambered.loc = Pewgun
|
||||
Pewgun.chambered.forceMove(Pewgun)
|
||||
visible_message("<span class='danger'>The <b>[src]</b> cocks itself!</span>")
|
||||
else
|
||||
ranged = 0 //BANZAIIII
|
||||
|
||||
@@ -213,7 +213,7 @@
|
||||
src.say("[pick(available_channels)] BAWWWWWK LEAVE THE HEADSET BAWKKKKK!")
|
||||
else
|
||||
src.say("BAWWWWWK LEAVE THE HEADSET BAWKKKKK!")
|
||||
ears.loc = src.loc
|
||||
ears.forceMove(src.loc)
|
||||
ears = null
|
||||
for(var/possible_phrase in speak)
|
||||
if(copytext(possible_phrase,1,3) in GLOB.department_radio_keys)
|
||||
@@ -504,7 +504,7 @@
|
||||
else //This should ensure that we only grab the item we want, and make sure it's not already collected on our perch
|
||||
if(!parrot_perch || parrot_interest.loc != parrot_perch.loc)
|
||||
held_item = parrot_interest
|
||||
parrot_interest.loc = src
|
||||
parrot_interest.forceMove(src)
|
||||
visible_message("[src] grabs [held_item]!", "<span class='notice'>You grab [held_item]!</span>", "<span class='italics'>You hear the sounds of wings flapping furiously.</span>")
|
||||
|
||||
parrot_interest = null
|
||||
@@ -526,7 +526,7 @@
|
||||
return
|
||||
|
||||
if(Adjacent(parrot_perch))
|
||||
src.loc = parrot_perch.loc
|
||||
forceMove(parrot_perch.loc)
|
||||
drop_held_item()
|
||||
parrot_state = PARROT_PERCH
|
||||
icon_state = icon_sit
|
||||
|
||||
@@ -302,11 +302,11 @@
|
||||
if(istype(worn, /obj/item/device/pda))
|
||||
var/obj/item/device/pda/PDA = worn
|
||||
PDA.id = id
|
||||
id.loc = worn
|
||||
id.forceMove(worn)
|
||||
else if(istype(worn, /obj/item/storage/wallet))
|
||||
var/obj/item/storage/wallet/W = worn
|
||||
W.front_id = id
|
||||
id.loc = worn
|
||||
id.forceMove(worn)
|
||||
worn.update_icon()
|
||||
var/datum/round_event/ion_storm/add_law_only/ion = new()
|
||||
ion.announceEvent = -1
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
if(mapload)
|
||||
for(var/obj/item/I in loc)
|
||||
if(istype(I, /obj/item/paper) || istype(I, /obj/item/folder) || istype(I, /obj/item/photo))
|
||||
I.loc = src
|
||||
I.forceMove(src)
|
||||
|
||||
/obj/structure/filingcabinet/deconstruct(disassembled = TRUE)
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
@@ -90,7 +90,7 @@
|
||||
if(contents.len)
|
||||
if(prob(40 + contents.len * 5))
|
||||
var/obj/item/I = pick(contents)
|
||||
I.loc = loc
|
||||
I.forceMove(loc)
|
||||
if(prob(25))
|
||||
step_rand(I)
|
||||
to_chat(user, "<span class='notice'>You pull \a [I] out of [src] at random.</span>")
|
||||
@@ -184,7 +184,8 @@ GLOBAL_LIST_EMPTY(employmentCabinets)
|
||||
icon_state = "employmentcabinet"
|
||||
var/virgin = 1
|
||||
|
||||
/obj/structure/filingcabinet/employment/New()
|
||||
/obj/structure/filingcabinet/employment/Initialize()
|
||||
. = ..()
|
||||
GLOB.employmentCabinets += src
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
if(!user.transferItemToLoc(P, src))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You replace [src]'s [P].</span>")
|
||||
P.loc = src
|
||||
P.forceMove(src)
|
||||
storedcutter = P
|
||||
update_icon()
|
||||
return
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
return
|
||||
var/obj/item/pen/P = locate(/obj/item/pen) in src.loc
|
||||
if(P && !bin_pen)
|
||||
P.loc = src
|
||||
P.forceMove(src)
|
||||
bin_pen = P
|
||||
update_icon()
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
if(bin_pen)
|
||||
var/obj/item/pen/P = bin_pen
|
||||
P.loc = user.loc
|
||||
P.forceMove(user.loc)
|
||||
user.put_in_hands(P)
|
||||
to_chat(user, "<span class='notice'>You take [P] out of \the [src].</span>")
|
||||
bin_pen = null
|
||||
@@ -90,7 +90,7 @@
|
||||
P.rigged = 1
|
||||
P.updateinfolinks()
|
||||
|
||||
P.loc = user.loc
|
||||
P.forceMove(user.loc)
|
||||
user.put_in_hands(P)
|
||||
to_chat(user, "<span class='notice'>You take [P] out of \the [src].</span>")
|
||||
else
|
||||
@@ -169,4 +169,4 @@
|
||||
CHECK_TICK
|
||||
qdel(src)
|
||||
else
|
||||
..()
|
||||
..()
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
"<span class='danger'>You fire the grenade launcher!</span>")
|
||||
var/obj/item/grenade/F = grenades[1] //Now with less copypasta!
|
||||
grenades -= F
|
||||
F.loc = user.loc
|
||||
F.forceMove(user.loc)
|
||||
F.throw_at(target, 30, 2, user)
|
||||
message_admins("[key_name_admin(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).")
|
||||
log_game("[key_name(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).")
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
if(istype(target, /obj/item/gun))
|
||||
var/obj/item/gun/G = target
|
||||
if(G.pin && (force_replace || G.pin.pin_removeable))
|
||||
G.pin.loc = get_turf(G)
|
||||
G.pin.forceMove(get_turf(G))
|
||||
G.pin.gun_remove(user)
|
||||
to_chat(user, "<span class ='notice'>You remove [G]'s old pin.</span>")
|
||||
|
||||
|
||||
@@ -285,7 +285,7 @@
|
||||
to_chat(new_mob, poly_msg)
|
||||
|
||||
M.transfer_observers_to(new_mob)
|
||||
|
||||
|
||||
qdel(M)
|
||||
return new_mob
|
||||
|
||||
@@ -319,7 +319,7 @@
|
||||
L.mind.transfer_to(S)
|
||||
if(owner)
|
||||
to_chat(S, "<span class='userdanger'>You are an animate statue. You cannot move when monitored, but are nearly invincible and deadly when unobserved! Do not harm [owner], your creator.</span>")
|
||||
P.loc = S
|
||||
P.forceMove(S)
|
||||
return
|
||||
else
|
||||
var/obj/O = src
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
if(!user || user.stat != CONSCIOUS || user.loc != O || O.loc != src )
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You successfully removed [O]'s wrapping !</span>")
|
||||
O.loc = loc
|
||||
O.forceMove(loc)
|
||||
playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1)
|
||||
qdel(src)
|
||||
else
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
|
||||
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
|
||||
for(var/mob/living/simple_animal/slime/S in X.stored_slimes)
|
||||
S.loc = remote_eye.loc
|
||||
S.forceMove(remote_eye.loc)
|
||||
S.visible_message("[S] warps in!")
|
||||
X.stored_slimes -= S
|
||||
else
|
||||
@@ -125,7 +125,7 @@
|
||||
if(S.buckled)
|
||||
S.Feedstop(silent=1)
|
||||
S.visible_message("[S] vanishes in a flash of light!")
|
||||
S.loc = X
|
||||
S.forceMove(X)
|
||||
X.stored_slimes += S
|
||||
else
|
||||
to_chat(owner, "<span class='notice'>Target is not near a camera. Cannot proceed.</span>")
|
||||
|
||||
@@ -473,7 +473,7 @@
|
||||
turfs -= T
|
||||
T = pick(turfs)
|
||||
else
|
||||
src.loc = T
|
||||
forceMove(T)
|
||||
break
|
||||
|
||||
//Pod suits/pickaxes
|
||||
|
||||
@@ -102,7 +102,7 @@
|
||||
|
||||
for(var/obj/item/I in embedded_objects)
|
||||
embedded_objects -= I
|
||||
I.loc = src
|
||||
I.forceMove(src)
|
||||
if(!C.has_embedded_objects())
|
||||
C.clear_alert("embeddedobject")
|
||||
|
||||
@@ -151,7 +151,7 @@
|
||||
if(brainmob)
|
||||
LB.brainmob = brainmob
|
||||
brainmob = null
|
||||
LB.brainmob.loc = LB
|
||||
LB.brainmob.forceMove(LB)
|
||||
LB.brainmob.container = LB
|
||||
LB.brainmob.stat = DEAD
|
||||
|
||||
@@ -167,7 +167,7 @@
|
||||
..()
|
||||
if(C && !special)
|
||||
if(C.handcuffed)
|
||||
C.handcuffed.loc = C.loc
|
||||
C.handcuffed.forceMove(C.loc)
|
||||
C.handcuffed.dropped(C)
|
||||
C.handcuffed = null
|
||||
C.update_handcuffed()
|
||||
@@ -185,7 +185,7 @@
|
||||
..()
|
||||
if(C && !special)
|
||||
if(C.handcuffed)
|
||||
C.handcuffed.loc = C.loc
|
||||
C.handcuffed.forceMove(C.loc)
|
||||
C.handcuffed.dropped(C)
|
||||
C.handcuffed = null
|
||||
C.update_handcuffed()
|
||||
@@ -201,7 +201,7 @@
|
||||
/obj/item/bodypart/r_leg/drop_limb(special)
|
||||
if(owner && !special)
|
||||
if(owner.legcuffed)
|
||||
owner.legcuffed.loc = owner.loc
|
||||
owner.legcuffed.forceMove(owner.loc)
|
||||
owner.legcuffed.dropped(owner)
|
||||
owner.legcuffed = null
|
||||
owner.update_inv_legcuffed()
|
||||
@@ -212,7 +212,7 @@
|
||||
/obj/item/bodypart/l_leg/drop_limb(special) //copypasta
|
||||
if(owner && !special)
|
||||
if(owner.legcuffed)
|
||||
owner.legcuffed.loc = owner.loc
|
||||
owner.legcuffed.forceMove(owner.loc)
|
||||
owner.legcuffed.dropped(owner)
|
||||
owner.legcuffed = null
|
||||
owner.update_inv_legcuffed()
|
||||
@@ -306,7 +306,7 @@
|
||||
if(brain)
|
||||
if(brainmob)
|
||||
brainmob.container = null //Reset brainmob head var.
|
||||
brainmob.loc = brain //Throw mob into brain.
|
||||
brainmob.forceMove(brain) //Throw mob into brain.
|
||||
brain.brainmob = brainmob //Set the brain to use the brainmob
|
||||
brainmob = null //Set head brainmob var to null
|
||||
brain.Insert(C) //Now insert the brain proper
|
||||
|
||||
@@ -41,10 +41,10 @@
|
||||
user.visible_message("<span class='warning'>[user] saws [src] open and pulls out a brain!</span>", "<span class='notice'>You saw [src] open and pull out a brain.</span>")
|
||||
if(brainmob)
|
||||
brainmob.container = null
|
||||
brainmob.loc = brain
|
||||
brainmob.forceMove(brain)
|
||||
brain.brainmob = brainmob
|
||||
brainmob = null
|
||||
brain.loc = T
|
||||
brain.forceMove(T)
|
||||
brain = null
|
||||
update_icon_dropped()
|
||||
else
|
||||
|
||||
@@ -118,7 +118,7 @@
|
||||
var/obj/item/bodypart/L = X
|
||||
for(var/obj/item/I in L.embedded_objects)
|
||||
L.embedded_objects -= I
|
||||
I.loc = T
|
||||
I.forceMove(T)
|
||||
|
||||
clear_alert("embeddedobject")
|
||||
|
||||
|
||||
@@ -176,7 +176,7 @@
|
||||
"<span class='notice'>You successfully extract [I] from [target]'s [parse_zone(target_zone)].</span>")
|
||||
add_logs(user, target, "surgically removed [I.name] from", addition="INTENT: [uppertext(user.a_intent)]")
|
||||
I.Remove(target)
|
||||
I.loc = get_turf(target)
|
||||
I.forceMove(get_turf(target))
|
||||
else
|
||||
user.visible_message("[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]!",
|
||||
"<span class='notice'>You can't extract anything from [target]'s [parse_zone(target_zone)]!</span>")
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
owner = M
|
||||
M.internal_organs |= src
|
||||
M.internal_organs_slot[slot] = src
|
||||
loc = null
|
||||
moveToNullspace()
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
A.Grant(M)
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
var/objects = 0
|
||||
for(var/obj/item/I in L.embedded_objects)
|
||||
objects++
|
||||
I.loc = get_turf(H)
|
||||
I.forceMove(get_turf(H))
|
||||
L.embedded_objects -= I
|
||||
if(!H.has_embedded_objects())
|
||||
H.clear_alert("embeddedobject")
|
||||
@@ -39,4 +39,4 @@
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You can't find [target]'s [parse_zone(user.zone_selected)], let alone any objects embedded in it!</span>")
|
||||
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -212,7 +212,7 @@
|
||||
add_overlay(img)
|
||||
add_overlay("evidence")
|
||||
desc = "An organ storage container holding [I]."
|
||||
I.loc = src
|
||||
I.forceMove(src)
|
||||
w_class = I.w_class
|
||||
|
||||
/obj/item/organ_storage/attack_self(mob/user)
|
||||
|
||||
Reference in New Issue
Block a user