diff --git a/code/__defines/flags.dm b/code/__defines/flags.dm
index e59dac70c5..2ff8f44dba 100644
--- a/code/__defines/flags.dm
+++ b/code/__defines/flags.dm
@@ -29,8 +29,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define OPENCONTAINER (1<<4) // Is an open container for chemistry purposes.
#define PHORONGUARD (1<<5) // Does not get contaminated by phoron.
#define NOREACT (1<<6) // Reagents don't react inside this container.
-#define PROXMOVE (1<<7)// Does this object require proximity checking in Enter()?
-#define OVERLAY_QUEUED (1<<8)// Atom queued to SSoverlay for COMPILE_OVERLAYS
+#define OVERLAY_QUEUED (1<<7)// Atom queued to SSoverlay for COMPILE_OVERLAYS
//Flags for items (equipment) - Used in /obj/item/var/item_flags
#define THICKMATERIAL (1<<0) // Prevents syringes, parapens and hyposprays if equipped to slot_suit or slot_head.
diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm
index 0e132a235f..6ec3ccb966 100644
--- a/code/_helpers/game.dm
+++ b/code/_helpers/game.dm
@@ -231,35 +231,43 @@
. = list()
// Returns a list of mobs who can hear any of the radios given in @radios
var/list/speaker_coverage = list()
- for(var/obj/item/device/radio/R in radios)
- if(R)
- //Cyborg checks. Receiving message uses a bit of cyborg's charge.
- var/obj/item/device/radio/borg/BR = R
- if(istype(BR) && BR.myborg)
- var/mob/living/silicon/robot/borg = BR.myborg
- var/datum/robot_component/CO = borg.get_component("radio")
- if(!CO)
- continue //No radio component (Shouldn't happen)
- if(!borg.is_component_functioning("radio") || !borg.cell_use_power(CO.active_usage))
- continue //No power.
-
- var/turf/speaker = get_turf(R)
- if(speaker)
- for(var/turf/T in hear(R.canhear_range,speaker))
- speaker_coverage[T] = R
+ for(var/r in radios)
+ var/obj/item/device/radio/R = r // You better fucking be a radio.
+ var/turf/speaker = get_turf(R)
+ if(speaker)
+ for(var/turf/T in hear(R.canhear_range,speaker))
+ speaker_coverage[T] = R
// Try to find all the players who can hear the message
for(var/i = 1; i <= player_list.len; i++)
var/mob/M = player_list[i]
- if(M)
- var/turf/ear = get_turf(M)
- if(ear)
- // Ghostship is magic: Ghosts can hear radio chatter from anywhere
- if(speaker_coverage[ear] || (istype(M, /mob/observer/dead) && M.is_preference_enabled(/datum/client_preference/ghost_radio)))
- . |= M // Since we're already looping through mobs, why bother using |= ? This only slows things down.
+ if(M.can_hear_radio(speaker_coverage))
+ . += M
return .
+/mob/proc/can_hear_radio(var/list/hearturfs)
+ return FALSE
+
+/mob/living/can_hear_radio(var/list/hearturfs)
+ return get_turf(src) in hearturfs
+
+/mob/living/silicon/robot/can_hear_radio(var/list/hearturfs)
+ var/turf/T = get_turf(src)
+ var/obj/item/device/radio/borg/R = hearturfs[T] // this should be an assoc list of turf-to-radio
+
+ // We heard it on our own radio? We use power for that.
+ if(istype(R) && R.myborg == src)
+ var/datum/robot_component/CO = get_component("radio")
+ if(!CO || !is_component_functioning("radio") || !cell_use_power(CO.active_usage))
+ return FALSE // Sorry, couldn't hear
+
+ return R // radio, true, false, what's the difference
+
+/mob/observer/dead/can_hear_radio(var/list/hearturfs)
+ return is_preference_enabled(/datum/client_preference/ghost_radio)
+
+
//Uses dview to quickly return mobs and objects in view,
// then adds additional mobs or objects if they are in range 'smartly',
// based on their presence in lists of players or registered objects
diff --git a/code/_helpers/icons_vr.dm b/code/_helpers/icons_vr.dm
index 60765578e7..1b500862b6 100644
--- a/code/_helpers/icons_vr.dm
+++ b/code/_helpers/icons_vr.dm
@@ -43,17 +43,3 @@
if (I.GetPixel(x_pixel, y_pixel))
return y_pixel - 1
return null
-
-//Standard behaviour is to cut pixels from the main icon that are covered by pixels from the mask icon unless passed mask_ready, see below.
-/proc/get_icon_difference(var/icon/main, var/icon/mask, var/mask_ready)
- /*You should skip prep if the mask is already sprited properly. This significantly improves performance by eliminating most of the realtime icon work.
- e.g. A 'ready' mask is a mask where the part you want cut out is missing (no pixels, 0 alpha) from the sprite, and everything else is solid white.*/
-
- if(istype(main) && istype(mask))
- if(!mask_ready) //Prep the mask if we're using a regular old sprite and not a special-made mask.
- mask.Blend(rgb(255,255,255), ICON_SUBTRACT) //Make all pixels on the mask as black as possible.
- mask.Opaque(rgb(255,255,255)) //Make the transparent pixels (background) white.
- mask.BecomeAlphaMask() //Make all the black pixels vanish (fully transparent), leaving only the white background pixels.
-
- main.AddAlphaMask(mask) //Make the pixels in the main icon that are in the transparent zone of the mask icon also vanish (fully transparent).
- return main
diff --git a/code/datums/observation/turf_enterexit.dm b/code/datums/observation/turf_enterexit.dm
new file mode 100644
index 0000000000..30cec0c39d
--- /dev/null
+++ b/code/datums/observation/turf_enterexit.dm
@@ -0,0 +1,33 @@
+// Observer Pattern Implementation: Turf Entered/Exited
+// Registration type: /turf
+//
+// Raised when: A /turf has a new item in contents, or an item has left it's contents
+//
+// Arguments that the called proc should expect:
+// /turf: The turf that was entered/exited
+// /atom/movable/moving_instance: The instance that entered/exited
+// /atom/old_loc / /atom/new_loc: The previous/new loc of the mover
+
+
+GLOBAL_DATUM_INIT(turf_entered_event, /decl/observ/turf_entered, new)
+GLOBAL_DATUM_INIT(turf_exited_event, /decl/observ/turf_exited, new)
+
+/decl/observ/turf_entered
+ name = "Turf Entered"
+ expected_type = /turf
+
+/decl/observ/turf_exited
+ name = "Turf Exited"
+ expected_type = /turf
+
+/********************
+* Movement Handling *
+********************/
+
+/turf/Entered(var/atom/movable/am, var/atom/old_loc)
+ . = ..()
+ GLOB.turf_entered_event.raise_event(src, am, old_loc)
+
+/turf/Exited(var/atom/movable/am, var/atom/new_loc)
+ . = ..()
+ GLOB.turf_exited_event.raise_event(src, am, new_loc)
\ No newline at end of file
diff --git a/code/defines/obj.dm b/code/defines/obj.dm
index 17014d95ed..062d81b265 100644
--- a/code/defines/obj.dm
+++ b/code/defines/obj.dm
@@ -29,7 +29,6 @@
density = 0
unacidable = 1//Just to be sure.
var/def_zone
- flags = PROXMOVE
pass_flags = PASSTABLE
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 123daae654..b1d994d3a3 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -118,15 +118,33 @@
/atom/proc/CheckExit()
return 1
-// If you want to use this, the atom must have the PROXMOVE flag, and the moving
-// atom must also have the PROXMOVE flag currently to help with lag. ~ ComicIronic
-/atom/proc/HasProximity(atom/movable/AM as mob|obj)
+// Used to be for the PROXMOVE flag, but that was terrible, so instead it's just here as a stub for
+// all the atoms that still have the proc, but get events other ways.
+/atom/proc/HasProximity(turf/T, atom/movable/AM, old_loc)
return
+//Register listeners on turfs in a certain range
+/atom/proc/sense_proximity(var/range = 1, var/callback)
+ ASSERT(callback)
+ ASSERT(isturf(loc))
+ var/list/turfs = trange(range, src)
+ for(var/t in turfs)
+ var/turf/T = t
+ GLOB.turf_entered_event.register(T, src, callback)
+
+//Unregister from prox listening in a certain range. You should do this BEFORE you move, but if you
+// really can't, then you can set the center where you moved from.
+/atom/proc/unsense_proximity(var/range = 1, var/callback, var/center)
+ ASSERT(isturf(center) || isturf(loc))
+ var/list/turfs = trange(range, center ? center : src)
+ for(var/t in turfs)
+ var/turf/T = t
+ GLOB.turf_entered_event.unregister(T, src, callback)
+
+
/atom/proc/emp_act(var/severity)
return
-
/atom/proc/bullet_act(obj/item/projectile/P, def_zone)
P.on_hit(src, 0, def_zone)
. = 0
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index 3dbe68fd29..ba5e1038f0 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -87,6 +87,8 @@
// VOREStation Edit End
/obj/machinery/camera/Destroy()
+ if(isMotion())
+ unsense_proximity(callback = .HasProximity)
deactivate(null, 0) //kick anyone viewing out
if(assembly)
qdel(assembly)
diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm
index eac1f89386..ad183a7be8 100644
--- a/code/game/machinery/camera/motion.dm
+++ b/code/game/machinery/camera/motion.dm
@@ -3,15 +3,13 @@
var/detectTime = 0
var/area/ai_monitored/area_motion = null
var/alarm_delay = 100 // Don't forget, there's another 10 seconds in queueAlarm()
- flags = PROXMOVE
/obj/machinery/camera/internal_process()
// motion camera event loop
if (stat & (EMPED|NOPOWER))
return
if(!isMotion())
- . = PROCESS_KILL
- return
+ return PROCESS_KILL
if (detectTime > 0)
var/elapsed = world.time - detectTime
if (elapsed > alarm_delay)
@@ -56,7 +54,7 @@
detectTime = -1
return 1
-/obj/machinery/camera/HasProximity(atom/movable/AM as mob|obj)
+/obj/machinery/camera/HasProximity(turf/T, atom/movable/AM, old_loc)
// Motion cameras outside of an "ai monitored" area will use this to detect stuff.
if (!area_motion)
if(isliving(AM))
diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm
index 33d79763f9..7bc8e9e6bd 100644
--- a/code/game/machinery/camera/presets.dm
+++ b/code/game/machinery/camera/presets.dm
@@ -227,9 +227,12 @@ var/global/list/engineering_networks = list(
update_coverage()
/obj/machinery/camera/proc/upgradeMotion()
+ if(!isturf(loc))
+ return //nooooo
assembly.upgrades.Add(new /obj/item/device/assembly/prox_sensor(assembly))
setPowerUsage()
START_MACHINE_PROCESSING(src)
+ sense_proximity(callback = .HasProximity)
update_coverage()
/obj/machinery/camera/proc/setPowerUsage()
diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm
index 572977ceb4..169fc6386c 100644
--- a/code/game/machinery/flasher.dm
+++ b/code/game/machinery/flasher.dm
@@ -13,7 +13,6 @@
anchored = 1
use_power = USE_POWER_IDLE
idle_power_usage = 2
- flags = PROXMOVE
/obj/machinery/flasher/portable //Portable version of the flasher. Only flashes when anchored
name = "portable flasher"
@@ -92,13 +91,13 @@
flash()
..(severity)
-/obj/machinery/flasher/portable/HasProximity(atom/movable/AM as mob|obj)
- if((disable) || (last_flash && world.time < last_flash + 150))
+/obj/machinery/flasher/portable/HasProximity(turf/T, atom/movable/AM, oldloc)
+ if(disable || !anchored || (last_flash && world.time < last_flash + 150))
return
- if(istype(AM, /mob/living/carbon))
+ if(iscarbon(AM))
var/mob/living/carbon/M = AM
- if((M.m_intent != "walk") && (anchored))
+ if(M.m_intent != "walk")
flash()
/obj/machinery/flasher/portable/attackby(obj/item/weapon/W as obj, mob/user as mob)
@@ -108,11 +107,13 @@
if(!anchored)
user.show_message(text("[src] can now be moved."))
- overlays.Cut()
-
+ cut_overlays()
+ unsense_proximity(callback = .HasProximity)
+
else if(anchored)
user.show_message(text("[src] is now secured."))
- overlays += "[base_state]-s"
+ add_overlay("[base_state]-s")
+ sense_proximity(callback = .HasProximity)
/obj/machinery/button/flasher
name = "flasher button"
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index edb8e56155..cb3e319915 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -59,8 +59,8 @@
I.decontaminate()
//Tanning!
- for(var/obj/item/stack/material/hairlesshide/HH in washing)
- var/obj/item/stack/material/wetleather/WL = new(src)
+ for(var/obj/item/stack/hairlesshide/HH in washing)
+ var/obj/item/stack/wetleather/WL = new(src)
WL.amount = HH.amount
qdel(HH)
diff --git a/code/game/objects/effects/alien/aliens.dm b/code/game/objects/effects/alien/aliens.dm
index 203b768d75..d11b054730 100644
--- a/code/game/objects/effects/alien/aliens.dm
+++ b/code/game/objects/effects/alien/aliens.dm
@@ -441,7 +441,6 @@
var/health = 100
var/status = BURST //can be GROWING, GROWN or BURST; all mutually exclusive
- flags = PROXMOVE
/obj/effect/alien/egg/New()
/*
@@ -545,16 +544,4 @@
/obj/effect/alien/egg/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > 500 + T0C)
health -= 5
- healthcheck()
-/*
-/obj/effect/alien/egg/HasProximity(atom/movable/AM as mob|obj)
- if(status == GROWN)
- if(!CanHug(AM))
- return
-
- var/mob/living/carbon/C = AM
- if(C.stat == CONSCIOUS && C.status_flags & XENO_HOST)
- return
-
- Burst(0)
-*/
\ No newline at end of file
+ healthcheck()
\ No newline at end of file
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index a6013b53e0..6fd5f0b386 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -643,11 +643,6 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
//Looking through a scope or binoculars should /not/ improve your periphereal vision. Still, increase viewsize a tiny bit so that sniping isn't as restricted to NSEW
/obj/item/var/ignore_visor_zoom_restriction = FALSE
-/obj/item/on_loc_moved(var/oldloc)
- . = ..()
- if(zoom)
- zoom() // aka unzoom
-
/obj/item/proc/zoom(var/tileoffset = 14,var/viewsize = 9) //tileoffset is client view offset in the direction the user is facing. viewsize is how far out this thing zooms. 7 is normal view
var/devicename
@@ -677,6 +672,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
H.toggle_zoom_hud() // If the user has already limited their HUD this avoids them having a HUD when they zoom in
H.set_viewsize(viewsize)
zoom = 1
+ GLOB.moved_event.register(H, src, .proc/zoom)
var/tilesize = 32
var/viewoffset = tilesize * tileoffset
@@ -705,6 +701,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
if(!H.hud_used.hud_shown)
H.toggle_zoom_hud()
zoom = 0
+ GLOB.moved_event.unregister(H, src, .proc/zoom)
H.client.pixel_x = 0
H.client.pixel_y = 0
@@ -773,13 +770,13 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
if(!inhands)
apply_custom(standing_icon) //Pre-image overridable proc to customize the thing
apply_addblends(icon2use,standing_icon) //Some items have ICON_ADD blend shaders
- if(istype(clip_mask)) //VOREStation Edit - For taur bodies/tails clipping off parts of uniforms and suits.
- standing_icon = get_icon_difference(standing_icon, clip_mask, 1)
var/image/standing = image(standing_icon)
standing.alpha = alpha
standing.color = color
standing.layer = layer2use
+ if(istype(clip_mask)) //VOREStation Edit - For taur bodies/tails clipping off parts of uniforms and suits.
+ standing.filters += filter(type = "alpha", icon = clip_mask)
//Apply any special features
if(!inhands)
diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm
index 4169dfc947..406919f96a 100644
--- a/code/game/objects/items/devices/transfer_valve.dm
+++ b/code/game/objects/items/devices/transfer_valve.dm
@@ -9,7 +9,6 @@
var/mob/attacher = null
var/valve_open = 0
var/toggle = 1
- flags = PROXMOVE
/obj/item/device/transfer_valve/attackby(obj/item/item, mob/user)
var/turf/location = get_turf(src) // For admin logs
@@ -57,11 +56,15 @@
return
-/obj/item/device/transfer_valve/HasProximity(atom/movable/AM as mob|obj)
- if(!attached_device) return
- attached_device.HasProximity(AM)
- return
+/obj/item/device/transfer_valve/HasProximity(turf/T, atom/movable/AM, old_loc)
+ attached_device?.HasProximity(T, AM, old_loc)
+/obj/item/device/transfer_valve/Moved(old_loc, direction, forced)
+ . = ..()
+ if(isturf(old_loc))
+ unsense_proximity(callback = .HasProximity, center = old_loc)
+ if(isturf(loc))
+ sense_proximity(callback = .HasProximity)
/obj/item/device/transfer_valve/attack_self(mob/user as mob)
ui_interact(user)
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index 255a739d84..ad3e349ba7 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -1,4 +1,4 @@
-/obj/item/stack/material/animalhide/human
+/obj/item/stack/animalhide/human
name = "human skin"
desc = "The by-product of human farming."
singular_name = "human skin piece"
@@ -6,63 +6,63 @@
no_variants = FALSE
drop_sound = 'sound/items/drop/clothing.ogg'
-/obj/item/stack/material/animalhide/human
+/obj/item/stack/animalhide/human
amount = 50
-/obj/item/stack/material/animalhide/corgi
+/obj/item/stack/animalhide/corgi
name = "corgi hide"
desc = "The by-product of corgi farming."
singular_name = "corgi hide piece"
icon_state = "sheet-corgi"
-/obj/item/stack/material/animalhide/corgi
+/obj/item/stack/animalhide/corgi
amount = 50
-/obj/item/stack/material/animalhide/cat
+/obj/item/stack/animalhide/cat
name = "cat hide"
desc = "The by-product of cat farming."
singular_name = "cat hide piece"
icon_state = "sheet-cat"
-/obj/item/stack/material/animalhide/cat
+/obj/item/stack/animalhide/cat
amount = 50
-/obj/item/stack/material/animalhide/monkey
+/obj/item/stack/animalhide/monkey
name = "monkey hide"
desc = "The by-product of monkey farming."
singular_name = "monkey hide piece"
icon_state = "sheet-monkey"
-/obj/item/stack/material/animalhide/monkey
+/obj/item/stack/animalhide/monkey
amount = 50
-/obj/item/stack/material/animalhide/lizard
+/obj/item/stack/animalhide/lizard
name = "lizard skin"
desc = "Sssssss..."
singular_name = "lizard skin piece"
icon_state = "sheet-lizard"
-/obj/item/stack/material/animalhide/lizard
+/obj/item/stack/animalhide/lizard
amount = 50
-/obj/item/stack/material/animalhide/xeno
+/obj/item/stack/animalhide/xeno
name = "alien hide"
desc = "The skin of a terrible creature."
singular_name = "alien hide piece"
icon_state = "sheet-xeno"
-/obj/item/stack/material/animalhide/xeno
+/obj/item/stack/animalhide/xeno
amount = 50
//don't see anywhere else to put these, maybe together they could be used to make the xenos suit?
-/obj/item/stack/material/xenochitin
+/obj/item/stack/xenochitin
name = "alien chitin"
desc = "A piece of the hide of a terrible creature."
singular_name = "alien hide piece"
icon = 'icons/mob/alien.dmi'
icon_state = "chitin"
-/obj/item/stack/material/xenochitin
+/obj/item/stack/xenochitin
amount = 50
/obj/item/xenos_claw
@@ -77,17 +77,17 @@
icon = 'icons/mob/alien.dmi'
icon_state = "weed_extract"
-/obj/item/stack/material/hairlesshide
+/obj/item/stack/hairlesshide
name = "hairless hide"
desc = "This hide was stripped of it's hair, but still needs tanning."
singular_name = "hairless hide piece"
icon_state = "sheet-hairlesshide"
no_variants = FALSE
-/obj/item/stack/material/hairlesshide
+/obj/item/stack/hairlesshide
amount = 50
-/obj/item/stack/material/wetleather
+/obj/item/stack/wetleather
name = "wet leather"
desc = "This leather has been cleaned but still needs to be dried."
singular_name = "wet leather piece"
@@ -96,11 +96,11 @@
var/drying_threshold_temperature = 500 //Kelvin to start drying
no_variants = FALSE
-/obj/item/stack/material/wetleather
+/obj/item/stack/wetleather
amount = 50
//Step one - dehairing.
-/obj/item/stack/material/animalhide/attackby(obj/item/weapon/W as obj, mob/user as mob)
+/obj/item/stack/animalhide/attackby(obj/item/weapon/W as obj, mob/user as mob)
if( istype(W, /obj/item/weapon/material/knife) || \
istype(W, /obj/item/weapon/material/twohanded/fireaxe) || \
istype(W, /obj/item/weapon/material/knife/machete/hatchet) )
@@ -110,13 +110,13 @@
if(do_after(user,50))
to_chat(usr, "You cut the hair from this [src.singular_name]")
//Try locating an exisitng stack on the tile and add to there if possible
- for(var/obj/item/stack/material/hairlesshide/HS in usr.loc)
+ for(var/obj/item/stack/hairlesshide/HS in usr.loc)
if(HS.amount < 50)
HS.amount++
src.use(1)
break
//If it gets to here it means it did not find a suitable stack on the tile.
- var/obj/item/stack/material/hairlesshide/HS = new(usr.loc)
+ var/obj/item/stack/hairlesshide/HS = new(usr.loc)
HS.amount = 1
src.use(1)
else
@@ -126,7 +126,7 @@
//Step two - washing..... it's actually in washing machine code.
//Step three - drying
-/obj/item/stack/material/wetleather/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+/obj/item/stack/wetleather/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
..()
if(exposed_temperature >= drying_threshold_temperature)
wetness--
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index a349f3b1fb..0cdf8887a5 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -678,6 +678,11 @@ var/list/global/tank_gauge_cache = list()
tank.update_icon()
tank.overlays -= "bomb_assembly"
-/obj/item/device/tankassemblyproxy/HasProximity(atom/movable/AM as mob|obj)
- if(src.assembly)
- src.assembly.HasProximity(AM)
+/obj/item/device/tankassemblyproxy/HasProximity(turf/T, atom/movable/AM, old_loc)
+ assembly?.HasProximity(T, AM, old_loc)
+
+/obj/item/device/tankassemblyproxy/Moved(old_loc, direction, forced)
+ if(isturf(old_loc))
+ unsense_proximity(callback = .HasProximity, center = old_loc)
+ if(isturf(loc))
+ sense_proximity(callback = .HasProximity)
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index f89aa2edc9..f81419be75 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -223,25 +223,22 @@
if(istype(W))
W.update_connections(1)
if(success)
- break
- if(success)
- break
+ break // breaks inner loop
if(!success)
- for(var/obj/O in T)
- for(var/b_type in blend_objects)
- if(istype(O, b_type))
- success = 1
- for(var/obj/structure/S in T)
- if(istype(S, src))
- success = 0
- for(var/nb_type in noblend_objects)
- if(istype(O, nb_type))
- success = 0
+ blend_obj_loop:
+ for(var/obj/O in T)
+ for(var/b_type in blend_objects)
+ if(istype(O, b_type))
+ success = 1
+ for(var/obj/structure/S in T)
+ if(istype(S, src))
+ success = 0
+ for(var/nb_type in noblend_objects)
+ if(istype(O, nb_type))
+ success = 0
- if(success)
- break
- if(success)
- break
+ if(success)
+ break blend_obj_loop // breaks outer loop
if(success)
dirs += get_dir(src, T)
diff --git a/code/game/objects/structures/catwalk.dm b/code/game/objects/structures/catwalk.dm
index cb2e434287..da481521d6 100644
--- a/code/game/objects/structures/catwalk.dm
+++ b/code/game/objects/structures/catwalk.dm
@@ -44,7 +44,6 @@
L.update_connections()
L.update_icon() //so siding get updated properly
-
/obj/structure/catwalk/update_icon()
update_connections()
cut_overlays()
@@ -78,7 +77,7 @@
new /obj/item/stack/rods(src.loc)
new /obj/item/stack/rods(src.loc)
//Lattice would delete itself, but let's save ourselves a new obj
- if(istype(src.loc, /turf/space) || istype(src.loc, /turf/simulated/open))
+ if(isspace(loc) || isopenspace(loc))
new /obj/structure/lattice/(src.loc)
if(plated_tile)
new plated_tile(src.loc)
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 6575e47a54..d206625193 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -142,18 +142,8 @@ turf/attackby(obj/item/weapon/W as obj, mob/user as mob)
sleep(2)
O.update_transform()
-var/const/enterloopsanity = 100
-/turf/Entered(atom/atom as mob|obj)
-
- if(movement_disabled)
- to_chat(usr, "Movement is admin-disabled.") //This is to identify lag problems
- return
- ..()
-
- if(!istype(atom, /atom/movable))
- return
-
- var/atom/movable/A = atom
+/turf/Entered(var/atom/movable/A, var/old_loc)
+ . = ..()
if(ismob(A))
var/mob/M = A
@@ -165,16 +155,6 @@ var/const/enterloopsanity = 100
M.inertia_dir = 0
M.make_floating(0)
- var/objects = 0
- if(A && (A.flags & PROXMOVE))
- for(var/atom/movable/thing in range(1))
- if(objects++ > enterloopsanity) break
- spawn(0)
- if(A) //Runtime prevention
- A.HasProximity(thing, 1)
- if ((thing && A) && (thing.flags & PROXMOVE))
- thing.HasProximity(A, 1)
-
/turf/CanPass(atom/movable/mover, turf/target)
if(!target)
return FALSE
diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm
index 2f6d7ab02f..824eb85b0a 100644
--- a/code/modules/assembly/holder.dm
+++ b/code/modules/assembly/holder.dm
@@ -3,7 +3,6 @@
icon = 'icons/obj/assemblies/new_assemblies.dmi'
icon_state = "holder"
item_state = "assembly"
- flags = PROXMOVE
throwforce = 5
w_class = ITEMSIZE_SMALL
throw_speed = 3
@@ -64,11 +63,18 @@
else
. += "\The [src] can be attached!"
-/obj/item/device/assembly_holder/HasProximity(atom/movable/AM as mob|obj)
+/obj/item/device/assembly_holder/Moved(atom/old_loc, direction, forced = FALSE)
+ . = ..()
+ if(isturf(old_loc))
+ unsense_proximity(callback = .HasProximity, center = old_loc)
+ if(isturf(loc))
+ sense_proximity(callback = .HasProximity)
+
+/obj/item/device/assembly_holder/HasProximity(turf/T, atom/movable/AM, old_loc)
if(a_left)
- a_left.HasProximity(AM)
+ a_left.HasProximity(T, AM, old_loc)
if(a_right)
- a_right.HasProximity(AM)
+ a_right.HasProximity(T, AM, old_loc)
/obj/item/device/assembly_holder/Crossed(atom/movable/AM as mob|obj)
if(AM.is_incorporeal())
diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm
index c439163fc2..f7d8e3e59e 100644
--- a/code/modules/assembly/proximity.dm
+++ b/code/modules/assembly/proximity.dm
@@ -4,7 +4,6 @@
icon_state = "prox"
origin_tech = list(TECH_MAGNET = 1)
matter = list(DEFAULT_WALL_MATERIAL = 800, "glass" = 200, "waste" = 50)
- flags = PROXMOVE
wires = WIRE_PULSE
secured = 0
@@ -33,7 +32,7 @@
update_icon()
return secured
-/obj/item/device/assembly/prox_sensor/HasProximity(atom/movable/AM as mob|obj)
+/obj/item/device/assembly/prox_sensor/HasProximity(turf/T, atom/movable/AM, old_loc)
if(!istype(AM))
log_debug("DEBUG: HasProximity called with [AM] on [src] ([usr]).")
return
@@ -90,6 +89,10 @@
/obj/item/device/assembly/prox_sensor/Moved(atom/old_loc, direction, forced = FALSE)
. = ..()
+ if(isturf(old_loc))
+ unsense_proximity(range = range, callback = .HasProximity, center = old_loc)
+ if(isturf(loc))
+ sense_proximity(range = range, callback = .HasProximity)
sense()
/obj/item/device/assembly/prox_sensor/interact(mob/user as mob)//TODO: Change this to the wires thingy
diff --git a/code/modules/awaymissions/loot_vr.dm b/code/modules/awaymissions/loot_vr.dm
index a002b264a7..d873a77a9c 100644
--- a/code/modules/awaymissions/loot_vr.dm
+++ b/code/modules/awaymissions/loot_vr.dm
@@ -52,7 +52,7 @@
var/amount = rand(2,6)
var/quantity = rand(10,50)
var/list/possible_spawns = list()
- for(var/bar_type in typesof(/obj/item/stack/material) - /obj/item/stack/material - /obj/item/stack/material/animalhide - typesof(/obj/item/stack/material/cyborg))
+ for(var/bar_type in typesof(/obj/item/stack/material) - /obj/item/stack/material - /obj/item/stack/animalhide - typesof(/obj/item/stack/material/cyborg))
possible_spawns += bar_type
var/bar_type = pick(possible_spawns)
diff --git a/code/modules/client/preferences_vr.dm b/code/modules/client/preferences_vr.dm
index 5d45a88608..4cb6695985 100644
--- a/code/modules/client/preferences_vr.dm
+++ b/code/modules/client/preferences_vr.dm
@@ -54,7 +54,7 @@
feedback_add_details("admin_verb","TEmoteNoise") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/toggle_ghost_quiets()
- set name = "Whisper/Subtle Vis"
+ set name = "Toggle Whisper/Subtle Vis"
set category = "Preferences"
set desc = "Toggle ghosts viewing your subtles/whispers."
diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm
index e3ac11ed76..2f93bb108b 100644
--- a/code/modules/hydroponics/spreading/spreading.dm
+++ b/code/modules/hydroponics/spreading/spreading.dm
@@ -72,8 +72,9 @@
var/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/plant
/obj/effect/plant/Destroy()
- if(plant_controller)
- plant_controller.remove_plant(src)
+ if(seed.get_trait(TRAIT_SPREAD)==2)
+ unsense_proximity(callback = .HasProximity, center = get_turf(src))
+ plant_controller.remove_plant(src)
for(var/obj/effect/plant/neighbor in range(1,src))
plant_controller.add_plant(neighbor)
return ..()
@@ -106,6 +107,7 @@
name = seed.display_name
max_health = round(seed.get_trait(TRAIT_ENDURANCE)/2)
if(seed.get_trait(TRAIT_SPREAD)==2)
+ sense_proximity(callback = .HasProximity) // Grabby
max_growth = VINE_GROWTH_STAGES
growth_threshold = max_health/VINE_GROWTH_STAGES
icon = 'icons/obj/hydroponics_vines.dmi'
diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm
index 8c694c8b00..58f4b4da08 100644
--- a/code/modules/hydroponics/spreading/spreading_response.dm
+++ b/code/modules/hydroponics/spreading/spreading_response.dm
@@ -1,4 +1,4 @@
-/obj/effect/plant/HasProximity(var/atom/movable/AM)
+/obj/effect/plant/HasProximity(turf/T, atom/movable/AM, old_loc)
if(!is_mature() || seed.get_trait(TRAIT_SPREAD) != 2)
return
@@ -13,6 +13,14 @@
spawn(1)
entangle(M)
+/obj/effect/plant/Moved(atom/old_loc, direction, forced = FALSE)
+ . = ..()
+ if(seed.get_trait(TRAIT_SPREAD)==2)
+ if(isturf(old_loc))
+ unsense_proximity(callback = .HasProximity, center = old_loc)
+ if(isturf(loc))
+ sense_proximity(callback = .HasProximity)
+
/obj/effect/plant/attack_hand(var/mob/user)
manual_unbuckle(user)
diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm
index 6218783b6e..e8a7a5dc89 100644
--- a/code/modules/integrated_electronics/core/assemblies.dm
+++ b/code/modules/integrated_electronics/core/assemblies.dm
@@ -349,14 +349,6 @@
return TRUE
return FALSE
-/obj/item/device/electronic_assembly/on_loc_moved(oldloc)
- for(var/obj/O in contents)
- O.on_loc_moved(oldloc)
-
-/obj/item/device/electronic_assembly/Moved(var/oldloc)
- for(var/obj/O in contents)
- O.on_loc_moved(oldloc)
-
/obj/item/device/electronic_assembly/proc/on_anchored()
for(var/obj/item/integrated_circuit/IC in contents)
IC.on_anchored()
diff --git a/code/modules/integrated_electronics/core/assemblies/clothing.dm b/code/modules/integrated_electronics/core/assemblies/clothing.dm
index d00057e411..23e84da6d6 100644
--- a/code/modules/integrated_electronics/core/assemblies/clothing.dm
+++ b/code/modules/integrated_electronics/core/assemblies/clothing.dm
@@ -67,18 +67,6 @@
else
..()
-/obj/item/clothing/Moved(oldloc)
- if(IC)
- IC.on_loc_moved(oldloc)
- else
- ..()
-
-/obj/item/clothing/on_loc_moved(oldloc)
- if(IC)
- IC.on_loc_moved(oldloc)
- else
- ..()
-
// Does most of the repeatative setup.
/obj/item/clothing/proc/setup_integrated_circuit(new_type)
// Set up the internal circuit holder.
diff --git a/code/modules/integrated_electronics/subtypes/output.dm b/code/modules/integrated_electronics/subtypes/output.dm
index 5154804b05..110d237629 100644
--- a/code/modules/integrated_electronics/subtypes/output.dm
+++ b/code/modules/integrated_electronics/subtypes/output.dm
@@ -414,8 +414,13 @@
// var/datum/beam/holo_beam = null // A visual effect, to make it easy to know where a hologram is coming from.
// It is commented out due to picking up the assembly killing the beam.
+/obj/item/integrated_circuit/output/holographic_projector/Initialize()
+ . = ..()
+ GLOB.moved_event.register(src, src, .proc/on_moved)
+
/obj/item/integrated_circuit/output/holographic_projector/Destroy()
destroy_hologram()
+ GLOB.moved_event.unregister(src, src, .proc/on_moved)
return ..()
/obj/item/integrated_circuit/output/holographic_projector/do_work()
@@ -506,7 +511,7 @@
if(hologram)
update_hologram()
-/obj/item/integrated_circuit/output/holographic_projector/on_loc_moved(atom/oldloc)
+/obj/item/integrated_circuit/output/holographic_projector/proc/on_moved()
if(hologram)
update_hologram_position()
diff --git a/code/modules/mob/living/carbon/human/emote_vr.dm b/code/modules/mob/living/carbon/human/emote_vr.dm
index 0fa6e35381..368a29a79c 100644
--- a/code/modules/mob/living/carbon/human/emote_vr.dm
+++ b/code/modules/mob/living/carbon/human/emote_vr.dm
@@ -23,18 +23,37 @@
if("mlem")
message = "mlems [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] tongue up over [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] nose. Mlem."
m_type = 1
+ if("blep")
+ message = "bleps [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] tongue out. Blep."
+ m_type = 1
if("awoo")
m_type = 2
message = "lets out an awoo."
playsound(loc, 'sound/voice/awoo.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises)
- if ("howl") // YW add begins
+ if("awoo2")
m_type = 2
- message = "lets out a howl."
- playsound(loc, 'sound/voice/howl.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) // YW add ends
+ message = "lets out an awoo."
+ playsound(loc, 'sound/voice/long_awoo.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises)
+ if("growl")
+ m_type = 2
+ message = "lets out a growl."
+ playsound(loc, 'sound/voice/growl.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises)
+ if("woof")
+ m_type = 2
+ message = "lets out an woof."
+ playsound(loc, 'sound/voice/woof.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises)
+ if("woof2")
+ m_type = 2
+ message = "lets out an woof."
+ playsound(loc, 'sound/voice/woof2.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises)
if("nya")
message = "lets out a nya."
m_type = 2
playsound(loc, 'sound/voice/nya.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises)
+ if("mrowl")
+ message = "mrowls."
+ m_type = 2
+ playsound(loc, 'sound/voice/mrow.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises)
if("peep")
message = "peeps like a bird."
m_type = 2
@@ -43,6 +62,10 @@
message = "chirps!"
playsound(loc, 'sound/misc/nymphchirp.ogg', 50, 0, preference = /datum/client_preference/emote_noises)
m_type = 2
+ if("hoot")
+ message = "hoots!"
+ playsound(loc, 'sound/voice/hoot.ogg', 50, 1, ,-1, preference = /datum/client_preference/emote_noises)
+ m_type = 2
if("weh")
message = "lets out a weh."
m_type = 2
@@ -59,14 +82,54 @@
message = "lets out a bark."
m_type = 2
playsound(loc, 'sound/voice/bark2.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises)
+ if("bork")
+ m_type = 2
+ message = "lets out a bork."
+ playsound(loc, 'sound/voice/bork.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises)
+ if ("mrow")
+ m_type = 2
+ message = "lets out a mrow."
+ playsound(loc, 'sound/voice/mrow.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises)
+ if ("hypno")
+ m_type = 2
+ message = "lets out a mystifying tone."
+ playsound(loc, 'sound/voice/hypno.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises)
if("hiss")
message = "lets out a hiss."
m_type = 2
playsound(loc, 'sound/voice/hiss.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises)
+ if("rattle")
+ message = "rattles!"
+ m_type = 2
+ playsound(loc, 'sound/voice/rattle.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises)
if("squeak")
message = "lets out a squeak."
m_type = 2
playsound(loc, 'sound/effects/mouse_squeak.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises)
+ if("geck")
+ message = "geckers!"
+ m_type = 2
+ playsound(loc, 'sound/voice/geck.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises)
+ if("baa")
+ message = "lets out a baa."
+ m_type = 2
+ playsound(loc, 'sound/voice/baa.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises)
+ if("baa2")
+ message = "bleats."
+ m_type = 2
+ playsound(loc, 'sound/voice/baa2.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises)
+ if("deathgasp2")
+ message = "[species.get_death_message()]"
+ m_type = 1
+ playsound(loc, 'sound/voice/deathgasp2.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises)
+ if("mar")
+ message = "lets out a mar."
+ m_type = 2
+ playsound(loc, 'sound/voice/mar.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises)
+ if("wurble")
+ message = "lets out a wurble."
+ m_type = 2
+ playsound(loc, 'sound/voice/wurble.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises)
if("nsay")
nsay()
return TRUE
@@ -89,6 +152,10 @@
message = "makes a weird noise!"
playsound(src.loc, 'sound/misc/ough.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises)
m_type = 2 //End of Yawn Addtion
+ if ("howl") // YW add begins
+ m_type = 2
+ message = "lets out a howl."
+ playsound(loc, 'sound/voice/howl.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) // YW add ends
if("flip")
var/list/involved_parts = list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT)
//Check if they are physically capable
@@ -101,7 +168,7 @@
message = "does a flip!"
m_type = 1
if("vhelp") //Help for Virgo-specific emotes.
- to_chat(src, "vwag, vflap, mlem, awoo, nya, peep, chirp, weh, merp, myarp, bark, hiss, squeak, nsay, nme, flip")
+ to_chat(src, "vwag, vflap, mlem, blep, awoo, awoo2, growl, nya, peep, chirp, hoot, weh, merp, myarp, bark, bork, mrow, hypno, hiss, rattle, squeak, geck, baa, baa2, mar, wurble, nsay, nme, flip")
return TRUE
if(message)
diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm
index ff2f630191..4bfffdfa47 100644
--- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm
+++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm
@@ -15,7 +15,6 @@ var/const/MAX_ACTIVE_TIME = 400
icon_state = "facehugger"
item_state = "facehugger"
w_class = 3 //note: can be picked up by aliens unlike most other items of w_class below 4
- flags = PROXMOVE
body_parts_covered = FACE|EYES
throw_range = 5
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index e259fd0de1..33f9702147 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -592,11 +592,11 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
//Build a uniform sprite
//VOREStation Edit start.
- var/icon/c_mask = null
- if(tail_style && tail_style.clip_mask_icon && tail_style.clip_mask_state)
+ var/icon/c_mask = tail_style?.clip_mask
+ if(c_mask)
var/obj/item/clothing/suit/S = wear_suit
- if(!(wear_suit && ((wear_suit.flags_inv & HIDETAIL) || (istype(S) && S.taurized)))) //Clip the lower half of the uniform off using the tail's clip mask.
- c_mask = new /icon(tail_style.clip_mask_icon, tail_style.clip_mask_state)
+ if(!istype(S) || (wear_suit.flags_inv & HIDETAIL) || S.taurized) // Reasons to not mask
+ c_mask = null
overlays_standing[UNIFORM_LAYER] = w_uniform.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_w_uniform_str, default_icon = uniform_sprite, default_layer = UNIFORM_LAYER, clip_mask = c_mask)
//VOREStation Edit end.
apply_layer(UNIFORM_LAYER)
@@ -780,10 +780,10 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
//VOREStation Edit start.
var/icon/c_mask = null
var/tail_is_rendered = (overlays_standing[TAIL_LAYER] || overlays_standing[TAIL_LAYER_ALT])
- var/valid_clip_mask = (tail_style && tail_style.clip_mask_icon && tail_style.clip_mask_state)
+ var/valid_clip_mask = tail_style?.clip_mask
if(tail_is_rendered && valid_clip_mask && !(suit && istype(suit) && suit.taurized)) //Clip the lower half of the suit off using the tail's clip mask for taurs since taur bodies aren't hidden.
- c_mask = new /icon(tail_style.clip_mask_icon, tail_style.clip_mask_state)
+ c_mask = valid_clip_mask
overlays_standing[SUIT_LAYER] = wear_suit.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_suit_str, default_icon = suit_sprite, default_layer = SUIT_LAYER, clip_mask = c_mask)
//VOREStation Edit end.
diff --git a/code/modules/mob/living/carbon/human/update_icons_vr.dm b/code/modules/mob/living/carbon/human/update_icons_vr.dm
index a8b941ebc3..45a5690ae6 100644
--- a/code/modules/mob/living/carbon/human/update_icons_vr.dm
+++ b/code/modules/mob/living/carbon/human/update_icons_vr.dm
@@ -1,50 +1,3 @@
-// WARNING - UNUSED PROC
-/mob/living/carbon/human/proc/get_wing_icon()
- if(QDESTROYING(src))
- return
-
- var/icon_key = "[species.get_race_key(src)][r_skin][g_skin][b_skin][r_hair][g_hair][b_hair]"
- var/icon/wing_icon = wing_icon_cache[icon_key]
- if(!wing_icon)
- //generate a new one
- var/species_wing_anim = species.get_wing_animation(src)
- if(species.icobase_wing) species_wing_anim = species.icobase
- if(!species_wing_anim) species_wing_anim = 'icons/effects/species.dmi'
- wing_icon = new/icon(species_wing_anim)
- if(species.color_mult)
- wing_icon.Blend(rgb(r_skin, g_skin, b_skin), ICON_MULTIPLY)
- else
- wing_icon.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
- // The following will not work with animated wings.
- var/use_species_wing = species.get_wing_hair(src)
- if(use_species_wing)
- var/icon/hair_icon = icon('icons/effects/species.dmi', "[species.get_wing(src)]_[use_species_wing]")
- hair_icon.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
- wing_icon.Blend(hair_icon, ICON_OVERLAY)
- wing_icon_cache[icon_key] = wing_icon
-
- return wing_icon
-
-// WARNING - UNUSED PROC
-/mob/living/carbon/human/proc/set_wing_state(var/t_state)
- if(QDESTROYING(src))
- return
-
- var/image/wing_overlay = overlays_standing[WING_LAYER]
-
- if(wing_overlay && species.get_wing_animation(src))
- wing_overlay.icon_state = t_state
- return wing_overlay
- return null
-
-// WARNING - UNUSED PROC
-/mob/living/carbon/human/proc/animate_wing_reset(var/update_icons=1)
- if(stat != DEAD)
- set_wing_state("[species.get_wing(src)]_idle[rand(0,9)]")
- else
- set_wing_state("[species.get_wing(src)]_static")
- toggle_wing_vr(FALSE)
-
/mob/living/carbon/human/proc/get_wing_image()
if(QDESTROYING(src))
return
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 375dd0a755..0b516955ef 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -3,7 +3,6 @@
layer = MOB_LAYER
plane = MOB_PLANE
animate_movement = 2
- flags = PROXMOVE
var/datum/mind/mind
var/stat = 0 //Whether a mob is alive or dead. TODO: Move this to living - Nodrak
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index 3d0f88e7a7..c76b7fcb4c 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -457,21 +457,6 @@
/mob/proc/update_gravity()
return
-// Called when a mob successfully moves.
-// Would've been an /atom/movable proc but it caused issues.
-/mob/Moved(atom/oldloc)
- . = ..()
- for(var/obj/O in contents)
- O.on_loc_moved(oldloc)
-
-// Received from Moved(), useful for items that need to know that their loc just moved.
-/obj/proc/on_loc_moved(atom/oldloc)
- return
-
-/obj/item/weapon/storage/on_loc_moved(atom/oldloc)
- for(var/obj/O in contents)
- O.on_loc_moved(oldloc)
-
/client/verb/moveup()
set name = ".moveup"
set instant = 1
diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm
index 6478ff999a..996847b13b 100644
--- a/code/modules/power/singularity/containment_field.dm
+++ b/code/modules/power/singularity/containment_field.dm
@@ -10,12 +10,15 @@
unacidable = 1
use_power = USE_POWER_OFF
light_range = 4
- flags = PROXMOVE
var/obj/machinery/field_generator/FG1 = null
var/obj/machinery/field_generator/FG2 = null
var/hasShocked = 0 //Used to add a delay between shocks. In some cases this used to crash servers by spawning hundreds of sparks every second.
+/obj/machinery/containment_field/Initialize()
+ sense_proximity(callback = .HasProximity)
+
/obj/machinery/containment_field/Destroy()
+ unsense_proximity(callback = .HasProximity)
if(FG1 && !FG1.clean_up)
FG1.cleanup()
if(FG2 && !FG2.clean_up)
@@ -33,7 +36,7 @@
/obj/machinery/containment_field/ex_act(severity)
return 0
-/obj/machinery/containment_field/HasProximity(atom/movable/AM as mob|obj)
+/obj/machinery/containment_field/HasProximity(turf/T, atom/movable/AM, old_loc)
if(istype(AM,/mob/living/silicon) && prob(40))
shock(AM)
return 1
@@ -42,8 +45,6 @@
return 1
return 0
-
-
/obj/machinery/containment_field/shock(mob/living/user as mob)
if(hasShocked)
return 0
diff --git a/code/modules/reagents/Chemistry-Recipes_vr.dm b/code/modules/reagents/Chemistry-Recipes_vr.dm
index fede57cab9..dfa4a24463 100644
--- a/code/modules/reagents/Chemistry-Recipes_vr.dm
+++ b/code/modules/reagents/Chemistry-Recipes_vr.dm
@@ -207,11 +207,11 @@
var/blocked = list(
/obj/item/stack/material, //Technical stacks
- /obj/item/stack/material/hairlesshide, //Useless leather production steps
- /obj/item/stack/material/wetleather,
+ /obj/item/stack/hairlesshide, //Useless leather production steps
+ /obj/item/stack/wetleather,
/obj/item/stack/material/algae/ten) //Why is this one even a separate thing
blocked += typesof(/obj/item/stack/material/cyborg) //Borg matter synths, should only exist in borgs
- blocked += typesof(/obj/item/stack/material/animalhide) //Hides which are only used for leather production anyway
+ blocked += typesof(/obj/item/stack/animalhide) //Hides which are only used for leather production anyway
var/rare_types = list(
/obj/item/stack/material/morphium, //Complex materials requiring Particle Smasher to create
diff --git a/code/modules/shieldgen/directional_shield.dm b/code/modules/shieldgen/directional_shield.dm
index 818b78a21e..26963a1227 100644
--- a/code/modules/shieldgen/directional_shield.dm
+++ b/code/modules/shieldgen/directional_shield.dm
@@ -97,17 +97,22 @@
var/high_color = "#0099FF" // Color the shield will be when at max health. A light blue.
var/low_color = "#FF0000" // Color the shield will drift towards as health is lowered. Deep red.
-/obj/item/shield_projector/New()
+/obj/item/shield_projector/Initialize()
START_PROCESSING(SSobj, src)
if(always_on)
create_shields()
+ GLOB.moved_event.register(src, src, .proc/moved_event)
..()
/obj/item/shield_projector/Destroy()
destroy_shields()
STOP_PROCESSING(SSobj, src)
+ GLOB.moved_event.unregister(src, src, .proc/moved_event)
return ..()
+/obj/item/shield_projector/proc/moved_event()
+ update_shield_positions()
+
/obj/item/shield_projector/proc/create_shield(var/newloc, var/new_dir)
var/obj/effect/directional_shield/S = new(newloc, src)
S.dir = new_dir
@@ -210,14 +215,6 @@
/obj/item/shield_projector/emp_act(var/severity)
adjust_health(-max_shield_health / severity) // A strong EMP will kill the shield instantly, but weaker ones won't on the first hit.
-/obj/item/shield_projector/Move(var/newloc, var/direct)
- ..(newloc, direct)
- update_shield_positions()
-
-/obj/item/shield_projector/on_loc_moved(atom/oldloc)
- update_shield_positions()
-
-
// Subtypes
/obj/item/shield_projector/rectangle
diff --git a/code/modules/tgs/v5/chat_commands.dm b/code/modules/tgs/v5/chat_commands.dm
index e1635fa7c4..acae136587 100644
--- a/code/modules/tgs/v5/chat_commands.dm
+++ b/code/modules/tgs/v5/chat_commands.dm
@@ -92,7 +92,7 @@ GLOBAL_LIST_EMPTY(pending_discord_registrations)
// Couldn't find them logged in.
if(!user)
- return "[sender.friendly_name], I couldn't find a logged-in user with the username of '[key_to_find]', which is what you provided after conversion to Byond's \"ckey\" format. Please connect to the game server and try again."
+ return "[sender.friendly_name], I couldn't find a logged-in user with the username of '[key_to_find]', which is what you provided after conversion to Byond's ckey format. Please connect to the game server and try again."
var/sql_ckey = sql_sanitize_text(key_to_find)
query = dbcon.NewQuery("SELECT discord_id FROM erro_player WHERE ckey = '[sql_ckey]'")
diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm b/code/modules/vore/appearance/sprite_accessories_vr.dm
index 9cc9519bfb..ef409eeba2 100644
--- a/code/modules/vore/appearance/sprite_accessories_vr.dm
+++ b/code/modules/vore/appearance/sprite_accessories_vr.dm
@@ -791,6 +791,12 @@
var/list/hide_body_parts = list() //Uses organ tag defines. Bodyparts in this list do not have their icons rendered, allowing for more spriter freedom when doing taur/digitigrade stuff.
var/icon/clip_mask_icon = null //Icon file used for clip mask.
var/clip_mask_state = null //Icon state to generate clip mask. Clip mask is used to 'clip' off the lower part of clothing such as jumpsuits & full suits.
+ var/icon/clip_mask = null //Instantiated clip mask of given icon and state
+
+/datum/sprite_accessory/tail/New()
+ . = ..()
+ if(clip_mask_icon && clip_mask_state)
+ clip_mask = icon(icon = clip_mask_icon, icon_state = clip_mask_state)
// Species-unique tails
diff --git a/sound/voice/awoo.ogg b/sound/voice/awoo.ogg
index 1cbdbc01df..a44e92b87f 100644
Binary files a/sound/voice/awoo.ogg and b/sound/voice/awoo.ogg differ
diff --git a/sound/voice/baa.ogg b/sound/voice/baa.ogg
new file mode 100644
index 0000000000..ea15f6fa2a
Binary files /dev/null and b/sound/voice/baa.ogg differ
diff --git a/sound/voice/baa2.ogg b/sound/voice/baa2.ogg
new file mode 100644
index 0000000000..5e0496044b
Binary files /dev/null and b/sound/voice/baa2.ogg differ
diff --git a/sound/voice/bork.ogg b/sound/voice/bork.ogg
new file mode 100644
index 0000000000..4993839b2d
Binary files /dev/null and b/sound/voice/bork.ogg differ
diff --git a/sound/voice/cursed/M Y A R P.ogg b/sound/voice/cursed/M Y A R P.ogg
new file mode 100644
index 0000000000..acad1ecf56
Binary files /dev/null and b/sound/voice/cursed/M Y A R P.ogg differ
diff --git a/sound/voice/cursed/awoo_short.ogg b/sound/voice/cursed/awoo_short.ogg
new file mode 100644
index 0000000000..8372e04c35
Binary files /dev/null and b/sound/voice/cursed/awoo_short.ogg differ
diff --git a/sound/voice/cursed/azura.ogg b/sound/voice/cursed/azura.ogg
new file mode 100644
index 0000000000..cdfe5145bc
Binary files /dev/null and b/sound/voice/cursed/azura.ogg differ
diff --git a/sound/voice/cursed/cursedmeow.ogg b/sound/voice/cursed/cursedmeow.ogg
new file mode 100644
index 0000000000..eeb3121ee4
Binary files /dev/null and b/sound/voice/cursed/cursedmeow.ogg differ
diff --git a/sound/voice/cursed/francis.ogg b/sound/voice/cursed/francis.ogg
new file mode 100644
index 0000000000..a5a7ba9a2d
Binary files /dev/null and b/sound/voice/cursed/francis.ogg differ
diff --git a/sound/voice/cursed/poe_loud.ogg b/sound/voice/cursed/poe_loud.ogg
new file mode 100644
index 0000000000..1d43971390
Binary files /dev/null and b/sound/voice/cursed/poe_loud.ogg differ
diff --git a/sound/voice/cursed/sam_michels.ogg b/sound/voice/cursed/sam_michels.ogg
new file mode 100644
index 0000000000..8ef0658835
Binary files /dev/null and b/sound/voice/cursed/sam_michels.ogg differ
diff --git a/sound/voice/deathgasp2.ogg b/sound/voice/deathgasp2.ogg
new file mode 100644
index 0000000000..644716fc78
Binary files /dev/null and b/sound/voice/deathgasp2.ogg differ
diff --git a/sound/voice/geck.ogg b/sound/voice/geck.ogg
new file mode 100644
index 0000000000..3e3692038b
Binary files /dev/null and b/sound/voice/geck.ogg differ
diff --git a/sound/voice/growl.ogg b/sound/voice/growl.ogg
new file mode 100644
index 0000000000..9637fce4cf
Binary files /dev/null and b/sound/voice/growl.ogg differ
diff --git a/sound/voice/hoot.ogg b/sound/voice/hoot.ogg
new file mode 100644
index 0000000000..6d184dac41
Binary files /dev/null and b/sound/voice/hoot.ogg differ
diff --git a/sound/voice/hypno.ogg b/sound/voice/hypno.ogg
new file mode 100644
index 0000000000..b6ba727be2
Binary files /dev/null and b/sound/voice/hypno.ogg differ
diff --git a/sound/voice/long_awoo.ogg b/sound/voice/long_awoo.ogg
new file mode 100644
index 0000000000..b6a87df294
Binary files /dev/null and b/sound/voice/long_awoo.ogg differ
diff --git a/sound/voice/mar.ogg b/sound/voice/mar.ogg
new file mode 100644
index 0000000000..d37b63ea45
Binary files /dev/null and b/sound/voice/mar.ogg differ
diff --git a/sound/voice/mrow.ogg b/sound/voice/mrow.ogg
new file mode 100644
index 0000000000..97e0558518
Binary files /dev/null and b/sound/voice/mrow.ogg differ
diff --git a/sound/voice/rattle.ogg b/sound/voice/rattle.ogg
new file mode 100644
index 0000000000..08386c036b
Binary files /dev/null and b/sound/voice/rattle.ogg differ
diff --git a/sound/voice/woof.ogg b/sound/voice/woof.ogg
new file mode 100644
index 0000000000..3a3d553098
Binary files /dev/null and b/sound/voice/woof.ogg differ
diff --git a/sound/voice/woof2.ogg b/sound/voice/woof2.ogg
new file mode 100644
index 0000000000..6a597c8ee9
Binary files /dev/null and b/sound/voice/woof2.ogg differ
diff --git a/sound/voice/wurble.ogg b/sound/voice/wurble.ogg
new file mode 100644
index 0000000000..324beeb128
Binary files /dev/null and b/sound/voice/wurble.ogg differ
diff --git a/vorestation.dme b/vorestation.dme
index 9a8555a9a2..ad7d578fa4 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -365,6 +365,7 @@
#include "code\datums\observation\shuttle_moved.dm"
#include "code\datums\observation\stat_set.dm"
#include "code\datums\observation\turf_changed.dm"
+#include "code\datums\observation\turf_enterexit.dm"
#include "code\datums\observation\unequipped.dm"
#include "code\datums\observation\z_moved.dm"
#include "code\datums\observation\~cleanup.dm"