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"