Merge branch 'release' of https://github.com/VOREStation/VOREStation into morevoreupdates

# Conflicts:
#	code/modules/mob/living/carbon/human/emote_vr.dm
This commit is contained in:
Repede
2020-05-18 20:30:52 -04:00
63 changed files with 299 additions and 272 deletions
+1 -2
View File
@@ -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.
+30 -22
View File
@@ -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
-14
View File
@@ -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
+33
View File
@@ -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)
-1
View File
@@ -29,7 +29,6 @@
density = 0
unacidable = 1//Just to be sure.
var/def_zone
flags = PROXMOVE
pass_flags = PASSTABLE
+22 -4
View File
@@ -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
+2
View File
@@ -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)
+2 -4
View File
@@ -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))
+3
View File
@@ -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()
+9 -8
View File
@@ -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("<span class='warning'>[src] can now be moved.</span>"))
overlays.Cut()
cut_overlays()
unsense_proximity(callback = .HasProximity)
else if(anchored)
user.show_message(text("<span class='warning'>[src] is now secured.</span>"))
overlays += "[base_state]-s"
add_overlay("[base_state]-s")
sense_proximity(callback = .HasProximity)
/obj/machinery/button/flasher
name = "flasher button"
+2 -2
View File
@@ -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)
+1 -14
View File
@@ -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)
*/
healthcheck()
+4 -7
View File
@@ -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)
@@ -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)
@@ -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, "<span class='notice'>You cut the hair from this [src.singular_name]</span>")
//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--
@@ -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)
+14 -17
View File
@@ -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)
+1 -2
View File
@@ -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)
+2 -22
View File
@@ -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, "<span class='warning'>Movement is admin-disabled.</span>") //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
+10 -4
View File
@@ -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())
+5 -2
View File
@@ -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
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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."
@@ -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'
@@ -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)
@@ -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()
@@ -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.
@@ -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()
@@ -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)
@@ -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
@@ -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.
@@ -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
-1
View File
@@ -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
-15
View File
@@ -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
@@ -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
@@ -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
+6 -9
View File
@@ -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
+1 -1
View File
@@ -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]'")
@@ -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
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
View File
@@ -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"