mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-08-24 05:38:15 +01:00
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:
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -29,7 +29,6 @@
|
||||
density = 0
|
||||
unacidable = 1//Just to be sure.
|
||||
var/def_zone
|
||||
flags = PROXMOVE
|
||||
pass_flags = PASSTABLE
|
||||
|
||||
|
||||
|
||||
+22
-4
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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()
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user