a few last minute changes from TG

also changes His Grace from 25 to 10 requirments
This commit is contained in:
Poojawa
2018-09-18 23:12:29 -05:00
parent 7d300117af
commit cb342866d6
32 changed files with 200 additions and 76 deletions
+1
View File
@@ -49,6 +49,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
//Movement Types
#define GROUND (1<<0)
#define FLYING (1<<1)
#define VENTCRAWLING (1<<2)
// Flags for reagents
#define REAGENT_NOREACT (1<<0)
+28 -6
View File
@@ -44,17 +44,33 @@
//EVENT CODES
#define TGS_EVENT_PORT_SWAP -2 //before a port change is about to happen, extra parameter is new port
#define TGS_EVENT_REBOOT_MODE_CHANGE -1 //before a reboot mode change, extras parameters are the current and new reboot mode enums
//TODO
//OTHER ENUMS
#define TGS_REBOOT_MODE_NORMAL 0
#define TGS_REBOOT_MODE_SHUTDOWN 1
#define TGS_REBOOT_MODE_RESTART 2
#define TGS_SECURITY_TRUSTED 0
#define TGS_SECURITY_SAFE 1
#define TGS_SECURITY_ULTRASAFE 2
//REQUIRED HOOKS
//Call this somewhere in /world/New() that is always run
//event_handler: optional user defined event handler. The default behaviour is to broadcast the event in english to all connected admin channels
/world/proc/TgsNew(datum/tgs_event_handler/event_handler)
//minimum_required_security_level: The minimum required security level to run the game in which the DMAPI is integrated
/world/proc/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE)
return
//Call this when your initializations are complete and your game is ready to play before any player interactions happen
//This may use world.sleep_offline to make this happen so ensure no changes are made to it while this call is running
//Most importantly, before this point, note that any static files or directories may be in use by another server. Your code should account for this
//This function should not be called before ..() in /world/New()
/world/proc/TgsInitializationComplete()
return
@@ -88,20 +104,22 @@
/datum/tgs_chat_channel
var/id //internal channel representation
var/friendly_name //user friendly channel name
var/server_name //server name the channel resides on
var/provider_name //chat provider for the channel
var/connection_name //the name of the configured chat connection
var/is_admin_channel //if the server operator has marked this channel for game admins only
var/is_private_channel //if this is a private chat channel
var/custom_tag //user defined string associated with channel
//represents a chat user
/datum/tgs_chat_user
var/id //Internal user representation
var/id //Internal user representation, requires channel to be unique
var/friendly_name //The user's public name
var/mention //The text to use to ping this user in a message
var/datum/tgs_chat_channel/channel //The /datum/tgs_chat_channel this user was from
//user definable callback for handling events
/datum/tgs_event_handler/proc/HandleEvent(event_code)
//extra parameters may be specified depending on the event
/datum/tgs_event_handler/proc/HandleEvent(event_code, ...)
set waitfor = FALSE
return
//user definable chat command
@@ -142,6 +160,10 @@
/world/proc/TgsRevision()
return
//Get the current BYOND security level
/world/proc/TgsSecurityLevel()
return
//Gets a list of active `/datum/tgs_revision_information/test_merge`s
/world/proc/TgsTestMerges()
return
@@ -199,4 +221,4 @@ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
*/
+2 -1
View File
@@ -19,7 +19,8 @@
/obj/effect/temp_visual,
/obj/effect/light_emitter/tendril,
/obj/effect/collapse,
/obj/effect/particle_effect/ion_trails
/obj/effect/particle_effect/ion_trails,
/obj/effect/dummy/phased_mob
))
/datum/component/chasm/Initialize(turf/target)
+1 -1
View File
@@ -17,7 +17,7 @@
var/mob/living/LM = parent
var/v = volume
var/e = e_range
if(!T.footstep || LM.lying || !LM.canmove || LM.resting || LM.buckled || LM.throwing)
if(!T.footstep || LM.lying || !LM.canmove || LM.resting || LM.buckled || LM.throwing || LM.movement_type & (VENTCRAWLING | FLYING))
return
if(iscarbon(LM))
var/mob/living/carbon/C = LM
+1 -1
View File
@@ -157,7 +157,7 @@
.["admins"] = presentmins.len + afkmins.len //equivalent to the info gotten from adminwho
.["gamestate"] = SSticker.current_state
.["map_name"] = SSmapping.config.map_name
.["map_name"] = SSmapping.config?.map_name || "Loading..."
if(key_valid)
.["active_players"] = get_active_player_count()
+1 -1
View File
@@ -1199,7 +1199,7 @@
optionlist = list("Standard", "Public", "Engineering", "Atmospherics", "Security", "Command", "Medical", "Research", "Freezer", "Science", "Virology", "Mining", "Maintenance", "External", "External Maintenance")
var/paintjob = input(user, "Please select a paintjob for this airlock.") in optionlist
if((!in_range(src, usr) && src.loc != usr) || !W.use(user))
if((!in_range(src, usr) && src.loc != usr) || !W.use_paint(user))
return
switch(paintjob)
if("Standard")
+1 -1
View File
@@ -21,7 +21,7 @@
var/prev_bloodthirst = HIS_GRACE_SATIATED
var/force_bonus = 0
var/ascended = FALSE
var/victims_needed = 25
var/victims_needed = 10 //Citadel change from 25 to 10
var/ascend_bonus = 15
/obj/item/his_grace/Initialize()
@@ -101,6 +101,9 @@
toolspeed = 0.1
random_color = FALSE
/obj/item/screwdriver/abductor/get_belt_overlay()
return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "screwdriver_nuke")
/obj/item/screwdriver/power
name = "hand drill"
desc = "A simple powered hand drill. It's fitted with a screw bit."
-4
View File
@@ -362,10 +362,6 @@
icon_state = "lavarocks"
desc = "A pile of rocks."
/obj/structure/flora/rock/pile/Initialize()
. = ..()
icon_state = "[icon_state][rand(1,3)]"
//Jungle grass
/obj/structure/flora/grass/jungle
+1 -1
View File
@@ -8,7 +8,7 @@
msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN)
if(!msg)
return
msg = emoji_parse(msg)
mob.log_talk(msg, LOG_ASAY)
msg = keywords_lookup(msg)
@@ -251,7 +251,7 @@
/obj/item/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, kind = "", datum/mind/user)
var/obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(T)
var/obj/effect/dummy/phased_mob/slaughter/holder = new /obj/effect/dummy/phased_mob/slaughter(T)
var/mob/living/simple_animal/slaughter/S = new demon_type(holder)
S.holder = holder
S.key = C.key
+3 -3
View File
@@ -219,7 +219,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master",
H.set_species(/datum/species/human, 1)
H.regenerate_icons()
give_appropriate_spells()
if(istype(owner.current.loc, /obj/effect/dummy/slaughter/))
if(istype(owner.current.loc, /obj/effect/dummy/phased_mob/slaughter/))
owner.current.forceMove(get_turf(owner.current))//Fixes dying while jaunted leaving you permajaunted.
form = BASIC_DEVIL
@@ -304,7 +304,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master",
sound_to_playing_players('sound/hallucinations/veryfar_noise.ogg')
give_appropriate_spells()
D.convert_to_archdevil()
if(istype(D.loc, /obj/effect/dummy/slaughter/))
if(istype(D.loc, /obj/effect/dummy/phased_mob/slaughter/))
D.forceMove(get_turf(D))//Fixes dying while jaunted leaving you permajaunted.
var/area/A = get_area(owner.current)
if(A)
@@ -430,7 +430,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master",
update_hud()
if(body)
body.revive(TRUE, TRUE) //Adminrevive also recovers organs, preventing someone from resurrecting without a heart.
if(istype(body.loc, /obj/effect/dummy/slaughter/))
if(istype(body.loc, /obj/effect/dummy/phased_mob/slaughter/))
body.forceMove(get_turf(body))//Fixes dying while jaunted leaving you permajaunted.
if(istype(body, /mob/living/carbon/true_devil))
var/mob/living/carbon/true_devil/D = body
@@ -51,8 +51,8 @@
..()
var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new
AddSpell(bloodspell)
if(istype(loc, /obj/effect/dummy/slaughter))
bloodspell.phased = 1
if(istype(loc, /obj/effect/dummy/phased_mob/slaughter))
bloodspell.phased = TRUE
/mob/living/simple_animal/slaughter/Life()
..()
@@ -31,7 +31,7 @@
message_admins("No valid spawn locations found, aborting...")
return MAP_ERROR
var/obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter((pick(spawn_locs)))
var/obj/effect/dummy/phased_mob/slaughter/holder = new /obj/effect/dummy/phased_mob/slaughter((pick(spawn_locs)))
var/mob/living/simple_animal/slaughter/S = new (holder)
S.holder = holder
player_mind.transfer_to(S)
@@ -444,13 +444,13 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache())
PLEASE DO NOT REMOVE THIS CODE. the commenting is here only for a performance increase.
enabling these checks should be as easy as possible and the fact that they are disabled should be as clear as possible
var/list/max_reqs = reaction.max_requirements.Copy()
var/list/max_reqs = reaction.max_requirements
if((max_reqs["TEMP"] && temp > max_reqs["TEMP"]) \
|| (max_reqs["ENER"] && ener > max_reqs["ENER"]))
continue
max_reqs -= "TEMP"
max_reqs -= "ENER"
for(var/id in max_reqs)
if(id == "TEMP" || id == "ENER")
continue
if(cached_gases[id] && cached_gases[id][MOLES] > max_reqs[id])
continue reaction_loop
//at this point, all requirements for the reaction are satisfied. we can now react()
@@ -455,6 +455,7 @@
//Replace miasma with oxygen
var/cleaned_air = min(cached_gases[/datum/gas/miasma][MOLES], 20 + (air.temperature - FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 70) / 20)
cached_gases[/datum/gas/miasma][MOLES] -= cleaned_air
ASSERT_GAS(/datum/gas/oxygen,air)
cached_gases[/datum/gas/oxygen][MOLES] += cleaned_air
//Possibly burning a bit of organic matter through maillard reaction, so a *tiny* bit more heat would be understandable
@@ -480,6 +480,7 @@
if("eject")
if(holding)
if(valve_open)
message_admins("[ADMIN_LOOKUPFLW(usr)] removed [holding] from [src] with valve still open at [ADMIN_VERBOSEJMP(src)] releasing contents into the <span class='boldannounce'>air</span><br>.")
investigate_log("[key_name(usr)] removed the [holding], leaving the valve open and transferring into the <span class='boldannounce'>air</span><br>", INVESTIGATE_ATMOS)
holding.forceMove(get_turf(src))
holding = null
+10 -2
View File
@@ -2039,8 +2039,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
character.backbag = backbag
character.dna.features = features.Copy()
character.dna.real_name = character.real_name
var/datum/species/chosen_species
if(!roundstart_checks || (pref_species.id in GLOB.roundstart_races))
chosen_species = pref_species.type
@@ -2048,7 +2046,17 @@ GLOBAL_LIST_EMPTY(preferences_datums)
chosen_species = /datum/species/human
pref_species = new /datum/species/human
save_character()
character.set_species(chosen_species, icon_update = FALSE, pref_load = TRUE)
character.dna.features = features.Copy()
character.dna.real_name = character.real_name
if("tail_lizard" in pref_species.default_features)
character.dna.species.mutant_bodyparts |= "tail_lizard"
else if("mam_tail" in pref_species.default_features)
character.dna.species.mutant_bodyparts |= "mam_tail"
else if("xenotail" in pref_species.default_features)
character.dna.species.mutant_bodyparts |= "xenotail"
if(icon_updates)
character.update_body()
+2
View File
@@ -1096,6 +1096,8 @@ GLOBAL_LIST_INIT(hallucination_list, list(
/obj/effect/hallucination/danger/chasm/Crossed(atom/movable/AM)
if(AM == target)
if(istype(target, /obj/effect/dummy/phased_mob))
return
to_chat(target, "<span class='userdanger'>You fall into the chasm!</span>")
target.Knockdown(40)
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, target, "<span class='notice'>It's surprisingly shallow.</span>"), 15)
+6 -6
View File
@@ -1,4 +1,4 @@
/obj/effect/dummy/slaughter //Can't use the wizard one, blocked by jaunt/slow
/obj/effect/dummy/phased_mob/slaughter //Can't use the wizard one, blocked by jaunt/slow
name = "water"
icon = 'icons/effects/effects.dmi'
icon_state = "nothing"
@@ -8,15 +8,15 @@
invisibility = 60
resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/effect/dummy/slaughter/relaymove(mob/user, direction)
/obj/effect/dummy/phased_mob/slaughter/relaymove(mob/user, direction)
forceMove(get_step(src,direction))
/obj/effect/dummy/slaughter/ex_act()
/obj/effect/dummy/phased_mob/slaughter/ex_act()
return
/obj/effect/dummy/slaughter/bullet_act()
/obj/effect/dummy/phased_mob/slaughter/bullet_act()
return
/obj/effect/dummy/slaughter/singularity_act()
/obj/effect/dummy/phased_mob/slaughter/singularity_act()
return
@@ -50,7 +50,7 @@
playsound(get_turf(src), 'sound/magic/enter_blood.ogg', 100, 1, -1)
// Extinguish, unbuckle, stop being pulled, set our location into the
// dummy object
var/obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(mobloc)
var/obj/effect/dummy/phased_mob/slaughter/holder = new /obj/effect/dummy/phased_mob/slaughter(mobloc)
src.ExtinguishMob()
// Keep a reference to whatever we're pulling, because forceMove()
@@ -91,8 +91,8 @@ Difficulty: Hard
return INITIALIZE_HINT_QDEL //There can be only one
var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new
AddSpell(bloodspell)
if(istype(loc, /obj/effect/dummy/slaughter))
bloodspell.phased = 1
if(istype(loc, /obj/effect/dummy/phased_mob/slaughter))
bloodspell.phased = TRUE
internal = new/obj/item/gps/internal/bubblegum(src)
/mob/living/simple_animal/hostile/megafauna/bubblegum/grant_achievement(medaltype,scoretype)
+2
View File
@@ -99,6 +99,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list(
pipes_shown += A.pipe_vision_img
if(client)
client.images += A.pipe_vision_img
movement_type |= VENTCRAWLING
/mob/living/proc/remove_ventcrawl()
@@ -106,6 +107,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list(
for(var/image/current_image in pipes_shown)
client.images -= current_image
pipes_shown.len = 0
movement_type &= ~VENTCRAWLING
+1 -1
View File
@@ -525,7 +525,7 @@
if(statpanel("Status"))
if (client)
stat(null, "Ping: [round(client.lastping, 1)]ms (Average: [round(client.avgping, 1)]ms)")
stat(null, "Map: [SSmapping.config.map_name]")
stat(null, "Map: [SSmapping.config?.map_name || "Loading..."]")
var/datum/map_config/cached = SSmapping.next_map_config
if(cached)
stat(null, "Next Map: [cached.map_name]")
+1
View File
@@ -75,6 +75,7 @@
K = src.key
var/spanned = src.say_quote(message, get_spans())
message = emoji_parse(message)
var/rendered = "<span class='game deadsay'><span class='prefix'>DEAD:</span> <span class='name'>[name]</span>[alt_name] <span class='message'>[emoji_parse(spanned)]</span></span>"
log_talk(message, LOG_SAY, tag="DEAD")
deadchat_broadcast(rendered, follow_target = src, speaker_key = K)
+4 -9
View File
@@ -344,9 +344,10 @@
flag = "magic"
var/weld = TRUE
var/created = FALSE //prevents creation of more then one locker if it has multiple hits
var/locker_suck = TRUE
/obj/item/projectile/magic/locker/prehit(atom/A)
if(ismob(A))
if(ismob(A) && locker_suck)
var/mob/M = A
if(M.anti_magic_check())
M.visible_message("<span class='warning'>[src] vanishes on contact with [A]!</span>")
@@ -371,6 +372,7 @@
return ..()
/obj/item/projectile/magic/locker/Destroy()
locker_suck = FALSE
for(var/atom/movable/AM in contents)
AM.forceMove(get_turf(src))
. = ..()
@@ -410,11 +412,6 @@
else
addtimer(CALLBACK(src, .proc/decay), 15 SECONDS)
/obj/structure/closet/decay/contents_explosion(severity, target)
for(var/atom/A in contents)
A.ex_act(severity/2, target) //Difference is it does half the damage to contents from explosion, to make fireball not completely instakill
CHECK_TICK
/obj/structure/closet/decay/proc/unmagify()
icon_state = weakened_icon
update_icon()
@@ -509,6 +506,4 @@
return
var/turf/T = get_turf(target)
for(var/i=0, i<50, i+=10)
addtimer(CALLBACK(GLOBAL_PROC, .proc/explosion, T, -1, exp_heavy, exp_light, exp_flash, FALSE, FALSE, exp_fire), i)
addtimer(CALLBACK(GLOBAL_PROC, .proc/explosion, T, -1, exp_heavy, exp_light, exp_flash, FALSE, FALSE, exp_fire), i)
+11
View File
@@ -246,6 +246,17 @@
if(total_cash >= threshold)
break
if(AM.pulling)
if(istype(AM.pulling, /obj/item/coin))
var/obj/item/coin/C = AM.pulling
total_cash += C.value
counted_money += C
else if(istype(AM.pulling, /obj/item/stack/spacecash))
var/obj/item/stack/spacecash/S = AM.pulling
total_cash += S.value * S.amount
counted_money += S
if(total_cash >= threshold)
for(var/obj/I in counted_money)
qdel(I)
+2 -2
View File
@@ -104,7 +104,7 @@
/obj/effect/proc_holder/spell/targeted/infernal_jaunt/cast(list/targets, mob/living/user = usr)
if(istype(user))
if(istype(user.loc, /obj/effect/dummy/slaughter/))
if(istype(user.loc, /obj/effect/dummy/phased_mob/slaughter/))
if(valid_location(user))
to_chat(user, "<span class='warning'>You are now phasing in.</span>")
if(do_mob(user,user,150))
@@ -145,7 +145,7 @@
spawn_dust()
visible_message("<span class='warning'>[src] disappears in a flashfire!</span>")
playsound(get_turf(src), 'sound/magic/enter_blood.ogg', 100, 1, -1)
var/obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(loc)
var/obj/effect/dummy/phased_mob/slaughter/holder = new /obj/effect/dummy/phased_mob/slaughter(loc)
ExtinguishMob()
forceMove(holder)
holder = holder
@@ -25,7 +25,7 @@
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/proc/do_jaunt(mob/living/target)
target.notransform = 1
var/turf/mobloc = get_turf(target)
var/obj/effect/dummy/spell_jaunt/holder = new /obj/effect/dummy/spell_jaunt(mobloc)
var/obj/effect/dummy/phased_mob/spell_jaunt/holder = new /obj/effect/dummy/phased_mob/spell_jaunt(mobloc)
new jaunt_out_type(mobloc, target.dir)
target.ExtinguishMob()
target.forceMove(holder)
@@ -62,7 +62,7 @@
steam.set_up(10, 0, mobloc)
steam.start()
/obj/effect/dummy/spell_jaunt
/obj/effect/dummy/phased_mob/spell_jaunt
name = "water"
icon = 'icons/effects/effects.dmi'
icon_state = "nothing"
@@ -74,13 +74,13 @@
invisibility = 60
resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/effect/dummy/spell_jaunt/Destroy()
/obj/effect/dummy/phased_mob/spell_jaunt/Destroy()
// Eject contents if deleted somehow
for(var/atom/movable/AM in src)
AM.forceMove(get_turf(src))
return ..()
/obj/effect/dummy/spell_jaunt/relaymove(var/mob/user, direction)
/obj/effect/dummy/phased_mob/spell_jaunt/relaymove(var/mob/user, direction)
if ((movedelay > world.time) || reappearing || !direction)
return
var/turf/newLoc = get_step(src,direction)
@@ -97,7 +97,7 @@
forceMove(newLoc)
/obj/effect/dummy/spell_jaunt/ex_act(blah)
return
/obj/effect/dummy/spell_jaunt/bullet_act(blah)
/obj/effect/dummy/phased_mob/spell_jaunt/ex_act(blah)
return
/obj/effect/dummy/phased_mob/spell_jaunt/bullet_act(blah)
return
+13 -14
View File
@@ -15,8 +15,8 @@
/obj/effect/proc_holder/spell/targeted/shadowwalk/cast(list/targets,mob/living/user = usr)
var/L = user.loc
if(istype(user.loc, /obj/effect/dummy/shadow))
var/obj/effect/dummy/shadow/S = L
if(istype(user.loc, /obj/effect/dummy/phased_mob/shadow))
var/obj/effect/dummy/phased_mob/shadow/S = L
S.end_jaunt(FALSE)
return
else
@@ -28,13 +28,13 @@
user.SetStun(0, FALSE)
user.SetKnockdown(0, FALSE)
user.setStaminaLoss(0, 0)
var/obj/effect/dummy/shadow/S2 = new(get_turf(user.loc))
var/obj/effect/dummy/phased_mob/shadow/S2 = new(get_turf(user.loc))
user.forceMove(S2)
S2.jaunter = user
else
to_chat(user, "<span class='warning'>It isn't dark enough here!</span>")
/obj/effect/dummy/shadow
/obj/effect/dummy/phased_mob/shadow
name = "darkness"
icon = 'icons/effects/effects.dmi'
icon_state = "nothing"
@@ -45,7 +45,7 @@
invisibility = 60
resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/effect/dummy/shadow/relaymove(mob/user, direction)
/obj/effect/dummy/phased_mob/shadow/relaymove(mob/user, direction)
var/turf/newLoc = get_step(src,direction)
if(isspaceturf(newLoc))
to_chat(user, "<span class='warning'>It really would not be wise to go into space.</span>")
@@ -53,7 +53,7 @@
forceMove(newLoc)
check_light_level()
/obj/effect/dummy/shadow/proc/check_light_level()
/obj/effect/dummy/phased_mob/shadow/proc/check_light_level()
var/turf/T = get_turf(src)
var/light_amount = T.get_lumcount()
if(light_amount > 0.2) // jaunt ends
@@ -61,7 +61,7 @@
else if (light_amount < 0.2 && (!QDELETED(jaunter))) //heal in the dark
jaunter.heal_overall_damage(1,1)
/obj/effect/dummy/shadow/proc/end_jaunt(forced = FALSE)
/obj/effect/dummy/phased_mob/shadow/proc/end_jaunt(forced = FALSE)
if(jaunter)
if(forced)
visible_message("<span class='boldwarning'>[jaunter] is revealed by the light!</span>")
@@ -72,27 +72,26 @@
jaunter = null
qdel(src)
/obj/effect/dummy/shadow/Initialize(mapload)
/obj/effect/dummy/phased_mob/shadow/Initialize(mapload)
. = ..()
START_PROCESSING(SSobj, src)
/obj/effect/dummy/shadow/Destroy()
/obj/effect/dummy/phased_mob/shadow/Destroy()
STOP_PROCESSING(SSobj, src)
. = ..()
/obj/effect/dummy/shadow/process()
/obj/effect/dummy/phased_mob/shadow/process()
if(!jaunter)
qdel(src)
if(jaunter.loc != src)
qdel(src)
check_light_level()
/obj/effect/dummy/shadow/ex_act()
/obj/effect/dummy/phased_mob/shadow/ex_act()
return
/obj/effect/dummy/shadow/bullet_act()
/obj/effect/dummy/phased_mob/shadow/bullet_act()
return
/obj/effect/dummy/shadow/singularity_act()
/obj/effect/dummy/phased_mob/shadow/singularity_act()
return