Merge branch 'master' into protRig

This commit is contained in:
Kashargul
2024-11-28 15:57:44 +01:00
committed by GitHub
337 changed files with 2617 additions and 3422 deletions
@@ -187,6 +187,27 @@ Works together with spawning an observer, noted above.
handle_regular_hud_updates()
handle_vision()
check_area() //RS Port #658
//RS Port #658 Start
/mob/observer/dead/proc/check_area()
if(client?.holder)
return
if(!isturf(loc))
return
var/area/A = get_area(src)
if(A.block_ghosts)
to_chat(src, span_warning("Ghosts can't enter this location."))
return_to_spawn()
/mob/observer/dead/proc/return_to_spawn()
if(following)
stop_following()
var/obj/O = locate("landmark*Observer-Start")
if(istype(O))
to_chat(src, span_notice("Now teleporting."))
forceMove(O.loc)
//RS Port #658 End
/mob/proc/ghostize(var/can_reenter_corpse = 1)
if(key)
@@ -429,6 +450,14 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
stop_following()
return
//RS Port #658 Start
var/area/A = get_area(destination)
if(A.block_ghosts)
to_chat(src,span_warning("Sorry, that area does not allow ghosts."))
if(following)
stop_following()
return
//RS Port #658 End
return ..()
/mob/observer/dead/Move(atom/newloc, direct = 0, movetime)
+1 -1
View File
@@ -302,7 +302,7 @@
else
var/datum/language/L = locate(href_list["default_lang"])
if(L && (L in languages))
set_default_language(L)
apply_default_language(L)
check_languages()
return 1
else if(href_list["set_lang_key"])
+5 -5
View File
@@ -201,8 +201,8 @@
/mob/living/bot/cleanbot/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
if(..())
return TRUE
usr.set_machine(src)
add_fingerprint(usr)
ui.user.set_machine(src)
add_fingerprint(ui.user)
switch(action)
if("start")
if(on)
@@ -222,11 +222,11 @@
. = TRUE
if("wet_floors")
wet_floors = !wet_floors
to_chat(usr, span_notice("You twiddle the screw."))
to_chat(ui.user, span_notice("You twiddle the screw."))
. = TRUE
if("spray_blood")
spray_blood = !spray_blood
to_chat(usr, span_notice("You press the weird button."))
to_chat(ui.user, span_notice("You press the weird button."))
. = TRUE
/mob/living/bot/cleanbot/emag_act(var/remaining_uses, var/mob/user)
@@ -272,6 +272,6 @@
var/t = sanitizeSafe(tgui_input_text(user, "Enter new robot name", name, created_name, MAX_NAME_LEN), MAX_NAME_LEN)
if(!t)
return
if(!in_range(src, usr) && src.loc != usr)
if(!in_range(src, user) && src.loc != user)
return
created_name = t
+4 -4
View File
@@ -87,15 +87,15 @@
switch(action)
if("red_switch")
red_switch = !red_switch
to_chat(usr, span_notice("You flip the red switch [red_switch ? "on" : "off"]."))
to_chat(ui.user, span_notice("You flip the red switch [red_switch ? "on" : "off"]."))
. = TRUE
if("green_switch")
green_switch = !green_switch
to_chat(usr, span_notice("You flip the green switch [green_switch ? "on" : "off"]."))
to_chat(ui.user, span_notice("You flip the green switch [green_switch ? "on" : "off"]."))
. = TRUE
if("blue_switch")
blue_switch = !blue_switch
to_chat(usr, span_notice("You flip the blue switch [blue_switch ? "on" : "off"]."))
to_chat(ui.user, span_notice("You flip the blue switch [blue_switch ? "on" : "off"]."))
. = TRUE
/mob/living/bot/cleanbot/edCLN/emag_act(var/remaining_uses, var/mob/user)
@@ -124,7 +124,7 @@
var/t = sanitizeSafe(tgui_input_text(user, "Enter new robot name", name, created_name, MAX_NAME_LEN), MAX_NAME_LEN)
if(!t)
return
if(!in_range(src, usr) && src.loc != usr)
if(!in_range(src, user) && src.loc != user)
return
created_name = t
return
+3 -3
View File
@@ -84,11 +84,11 @@
if(..())
return TRUE
add_fingerprint(usr)
add_fingerprint(ui.user)
switch(action)
if("power")
if(!access_scanner.allowed(usr))
if(!access_scanner.allowed(ui.user))
return FALSE
if(on)
turn_off()
@@ -413,7 +413,7 @@
t = sanitize(t, MAX_NAME_LEN)
if(!t)
return
if(!in_range(src, usr) && loc != usr)
if(!in_range(src, user) && loc != user)
return
created_name = t
+1 -1
View File
@@ -86,7 +86,7 @@
turn_on()
. = TRUE
if(locked && !issilicon(usr))
if(locked && !issilicon(ui.user))
return
switch(action)
+5 -5
View File
@@ -269,20 +269,20 @@
if(..())
return TRUE
usr.set_machine(src)
add_fingerprint(usr)
ui.user.set_machine(src)
add_fingerprint(ui.user)
. = TRUE
switch(action)
if("power")
if(!access_scanner.allowed(usr))
if(!access_scanner.allowed(ui.user))
return FALSE
if(on)
turn_off()
else
turn_on()
if(locked && !issilicon(usr))
if(locked && !issilicon(ui.user))
return TRUE
switch(action)
@@ -538,7 +538,7 @@
var/t = sanitizeSafe(tgui_input_text(user, "Enter new robot name", name, created_name, MAX_NAME_LEN), MAX_NAME_LEN)
if(!t)
return
if(!in_range(src, usr) && loc != usr)
if(!in_range(src, user) && loc != user)
return
created_name = t
else
+12 -12
View File
@@ -82,43 +82,43 @@
data["safety"] = safety
return data
/mob/living/bot/mulebot/tgui_act(action, params)
/mob/living/bot/mulebot/tgui_act(action, params, datum/tgui/ui)
if(..())
return TRUE
add_fingerprint(usr)
add_fingerprint(ui.user)
switch(action)
if("power")
if(on)
turn_off()
else
turn_on()
visible_message("[usr] switches [on ? "on" : "off"] [src].")
visible_message("[ui.user] switches [on ? "on" : "off"] [src].")
. = TRUE
if("stop")
obeyCommand("Stop")
obeyCommand(ui.user, "Stop")
. = TRUE
if("go")
obeyCommand("GoTD")
obeyCommand(ui.user, "GoTD")
. = TRUE
if("home")
obeyCommand("Home")
obeyCommand(ui.user, "Home")
. = TRUE
if("destination")
obeyCommand("SetD")
obeyCommand(ui.user, "SetD")
. = TRUE
if("sethome")
var/new_dest
var/list/beaconlist = GetBeaconList()
if(beaconlist.len)
new_dest = tgui_input_list(usr, "Select new home tag", "Mulebot [suffix ? "([suffix])" : ""]", beaconlist)
new_dest = tgui_input_list(ui.user, "Select new home tag", "Mulebot [suffix ? "([suffix])" : ""]", beaconlist)
else
tgui_alert_async(usr, "No destination beacons available.")
tgui_alert_async(ui.user, "No destination beacons available.")
if(new_dest)
home = get_turf(beaconlist[new_dest])
homeName = new_dest
@@ -144,7 +144,7 @@
..()
update_icons()
/mob/living/bot/mulebot/proc/obeyCommand(var/command)
/mob/living/bot/mulebot/proc/obeyCommand(mob/user, var/command)
switch(command)
if("Home")
resetTarget()
@@ -154,9 +154,9 @@
var/new_dest
var/list/beaconlist = GetBeaconList()
if(beaconlist.len)
new_dest = tgui_input_list(usr, "Select new destination tag", "Mulebot [suffix ? "([suffix])" : ""]", beaconlist)
new_dest = tgui_input_list(user, "Select new destination tag", "Mulebot [suffix ? "([suffix])" : ""]", beaconlist)
else
tgui_alert_async(usr, "No destination beacons available.")
tgui_alert_async(user, "No destination beacons available.")
if(new_dest)
resetTarget()
target = get_turf(beaconlist[new_dest])
+3 -3
View File
@@ -129,11 +129,11 @@
if(..())
return
add_fingerprint(usr)
add_fingerprint(ui.user)
switch(action)
if("power")
if(!access_scanner.allowed(usr))
if(!access_scanner.allowed(ui.user))
return FALSE
if(on)
turn_off()
@@ -141,7 +141,7 @@
turn_on()
. = TRUE
if(locked && !issilicon(usr))
if(locked && !issilicon(ui.user))
return TRUE
switch(action)
@@ -31,6 +31,13 @@
set desc = "Shift yourself out of alignment with realspace to travel quickly to different areas."
set category = "Abilities.Shadekin"
//RS Port #658 Start
var/area/A = get_area(src)
if(!client?.holder && A.block_phase_shift)
to_chat(src, span_warning("You can't do that here!"))
return
//RS Port #658 End
var/ability_cost = 100
var/darkness = 1
@@ -76,19 +83,30 @@
to_chat(src,span_warning("You can't use that here!"))
return FALSE
forceMove(T)
var/original_canmove = canmove
SetStunned(0)
SetWeakened(0)
if(buckled)
buckled.unbuckle_mob()
if(pulledby)
pulledby.stop_pulling()
stop_pulling()
canmove = FALSE
//Shifting in
if(ability_flags & AB_PHASE_SHIFTED)
phase_in(T)
//Shifting out
else
phase_out(T)
/mob/living/carbon/human/proc/phase_in(var/turf/T)
if(ability_flags & AB_PHASE_SHIFTED)
// pre-change
forceMove(T)
var/original_canmove = canmove
SetStunned(0)
SetWeakened(0)
if(buckled)
buckled.unbuckle_mob()
if(pulledby)
pulledby.stop_pulling()
stop_pulling()
// change
canmove = FALSE
ability_flags &= ~AB_PHASE_SHIFTED
ability_flags |= AB_PHASE_SHIFTING
mouse_opacity = 1
@@ -137,8 +155,22 @@
L.broken()
else
L.flicker(10)
//Shifting out
else
/mob/living/carbon/human/proc/phase_out(var/turf/T)
if(!(ability_flags & AB_PHASE_SHIFTED))
// pre-change
forceMove(T)
var/original_canmove = canmove
SetStunned(0)
SetWeakened(0)
if(buckled)
buckled.unbuckle_mob()
if(pulledby)
pulledby.stop_pulling()
stop_pulling()
canmove = FALSE
// change
ability_flags |= AB_PHASE_SHIFTED
ability_flags |= AB_PHASE_SHIFTING
mouse_opacity = 0
@@ -309,7 +309,7 @@
last_special = world.time + 25
var/new_skin = input(usr, "Please select a new body color.", "Shapeshifter Colour", color) as null|color
var/new_skin = input(src, "Please select a new body color.", "Shapeshifter Colour", color) as null|color
if(!new_skin)
return
color = new_skin
@@ -306,7 +306,7 @@
to_chat(src,span_warning("You must be awake and standing to perform this action!"))
return
var/new_species = tgui_input_list(usr, "Please select a species to emulate.", "Shapeshifter Body", list(species?.vanity_base_fit)|species?.get_valid_shapeshifter_forms())
var/new_species = tgui_input_list(src, "Please select a species to emulate.", "Shapeshifter Body", list(species?.vanity_base_fit)|species?.get_valid_shapeshifter_forms())
if(new_species)
species?.base_species = new_species // Really though you better have a species
regenerate_icons() //Expensive, but we need to recrunch all the icons we're wearing
@@ -4,15 +4,15 @@
// Sanity is mostly handled in chimera_regenerate()
if(stat == DEAD)
var/confirm = tgui_alert(usr, "Are you sure you want to regenerate your corpse? This process can take up to thirty minutes.", "Confirm Regeneration", list("Yes", "No"))
var/confirm = tgui_alert(src, "Are you sure you want to regenerate your corpse? This process can take up to thirty minutes.", "Confirm Regeneration", list("Yes", "No"))
if(confirm == "Yes")
chimera_regenerate()
else if (quickcheckuninjured())
var/confirm = tgui_alert(usr, "Are you sure you want to regenerate? As you are uninjured this will only take 30 seconds and match your appearance to your character slot.", "Confirm Regeneration", list("Yes", "No"))
var/confirm = tgui_alert(src, "Are you sure you want to regenerate? As you are uninjured this will only take 30 seconds and match your appearance to your character slot.", "Confirm Regeneration", list("Yes", "No"))
if(confirm == "Yes")
chimera_regenerate()
else
var/confirm = tgui_alert(usr, "Are you sure you want to completely reconstruct your form? This process can take up to fifteen minutes, depending on how hungry you are, and you will be unable to move.", "Confirm Regeneration", list("Yes", "No"))
var/confirm = tgui_alert(src, "Are you sure you want to completely reconstruct your form? This process can take up to fifteen minutes, depending on how hungry you are, and you will be unable to move.", "Confirm Regeneration", list("Yes", "No"))
if(confirm == "Yes")
chimera_regenerate()
@@ -113,7 +113,7 @@
remove_verb(src, /mob/living/carbon/human/proc/hatch)
return
var/confirm = tgui_alert(usr, "Are you sure you want to hatch right now? This will be very obvious to anyone in view.", "Confirm Regeneration", list("Yes", "No"))
var/confirm = tgui_alert(src, "Are you sure you want to hatch right now? This will be very obvious to anyone in view.", "Confirm Regeneration", list("Yes", "No"))
if(confirm == "Yes")
//Dead when hatching
@@ -830,13 +830,13 @@
if(!T_ext) //Picking something here is critical.
return
if(T_ext.vital)
if(tgui_alert(usr, "Are you sure you wish to severely damage their [T_ext]? It will likely kill [T]...","Shred Limb",list("Yes", "No")) != "Yes")
if(tgui_alert(src, "Are you sure you wish to severely damage their [T_ext]? It will likely kill [T]...","Shred Limb",list("Yes", "No")) != "Yes")
return //If they reconsider, don't continue.
//Any internal organ, if there are any
var/obj/item/organ/internal/T_int = tgui_input_list(src,"Do you wish to severely damage an internal organ, as well? If not, click 'cancel'", "Organ Choice", T_ext.internal_organs)
if(T_int && T_int.vital)
if(tgui_alert(usr, "Are you sure you wish to severely damage their [T_int]? It will likely kill [T]...","Shred Limb",list("Yes", "No")) != "Yes")
if(tgui_alert(src, "Are you sure you wish to severely damage their [T_int]? It will likely kill [T]...","Shred Limb",list("Yes", "No")) != "Yes")
return //If they reconsider, don't continue.
//And a belly, if they want
@@ -1112,7 +1112,7 @@
to_chat(src, span_warning("You are not a weaver! How are you doing this? Tell a developer!"))
return
var/new_silk_color = input(usr, "Pick a color for your woven products:","Silk Color", species.silk_color) as null|color
var/new_silk_color = input(src, "Pick a color for your woven products:","Silk Color", species.silk_color) as null|color
if(new_silk_color)
species.silk_color = new_silk_color
@@ -1274,11 +1274,11 @@
return
if(choice == "Color") //Easy way to set color so we don't bloat up the menu with even more buttons.
var/new_color = input(usr, "Choose a color to set your appendage to!", "", appendage_color) as color|null
var/new_color = input(src, "Choose a color to set your appendage to!", "", appendage_color) as color|null
if(new_color)
appendage_color = new_color
if(choice == "Functionality") //Easy way to set color so we don't bloat up the menu with even more buttons.
var/choice2 = tgui_alert(usr, "Choose if you want to be pulled to the target or pull them to you!", "Functionality Setting", list("Pull target to self", "Pull self to target"))
var/choice2 = tgui_alert(src, "Choose if you want to be pulled to the target or pull them to you!", "Functionality Setting", list("Pull target to self", "Pull self to target"))
if(!choice2)
return
if(choice2 == "Pull target to self")
@@ -1564,19 +1564,19 @@
return
if(choice == "Change reagent")
var/reagent_choice = tgui_input_list(usr, "Choose which reagent to inject!", "Select reagent", trait_injection_reagents)
var/reagent_choice = tgui_input_list(src, "Choose which reagent to inject!", "Select reagent", trait_injection_reagents)
if(reagent_choice)
trait_injection_selected = reagent_choice
to_chat(src, span_notice("You prepare to inject [trait_injection_amount] units of [trait_injection_selected ? "[trait_injection_selected]" : "...nothing. Select a reagent before trying to inject anything."]"))
return
if(choice == "Change amount")
var/amount_choice = tgui_input_number(usr, "How much of the reagent do you want to inject? (Up to 5 units) (Can select 0 for a bite that doesn't inject venom!)", "How much?", trait_injection_amount, 5, 0, round_value = FALSE)
var/amount_choice = tgui_input_number(src, "How much of the reagent do you want to inject? (Up to 5 units) (Can select 0 for a bite that doesn't inject venom!)", "How much?", trait_injection_amount, 5, 0, round_value = FALSE)
if(amount_choice >= 0)
trait_injection_amount = amount_choice
to_chat(src, span_notice("You prepare to inject [trait_injection_amount] units of [trait_injection_selected ? "[trait_injection_selected]" : "...nothing. Select a reagent before trying to inject anything."]"))
return
if(choice == "Change verb")
var/verb_choice = tgui_input_text(usr, "Choose the percieved manner of injection, such as 'bites' or 'stings', don't be misleading or abusive. This will show up in game as ('X' 'Verb' 'Y'. Example: X bites Y.)", "How are you injecting?", trait_injection_verb, max_length = 60) //Whoaa there cowboy don't put a novel in there.
var/verb_choice = tgui_input_text(src, "Choose the percieved manner of injection, such as 'bites' or 'stings', don't be misleading or abusive. This will show up in game as ('X' 'Verb' 'Y'. Example: X bites Y.)", "How are you injecting?", trait_injection_verb, max_length = 60) //Whoaa there cowboy don't put a novel in there.
if(verb_choice)
trait_injection_verb = verb_choice
to_chat(src, span_notice("You will [trait_injection_verb] your targets."))
@@ -1611,7 +1611,7 @@
You can also bite synthetics, but due to how synths work, they won't have anything injected into them.
<br>
"}
usr << browse(output,"window=chemicalrefresher")
src << browse(output,"window=chemicalrefresher")
return
else
var/list/targets = list() //IF IT IS NOT BROKEN. DO NOT FIX IT. AND KEEP COPYPASTING IT (Pointing Rick Dalton: "That's my code!" ~CL)
@@ -1657,7 +1657,7 @@
add_attack_logs(src,target,"Injection trait ([trait_injection_selected], [trait_injection_amount])")
if(target.reagents && (trait_injection_amount > 0) && !synth)
target.reagents.add_reagent(trait_injection_selected, trait_injection_amount)
var/ourmsg = "[usr] [trait_injection_verb] [target] "
var/ourmsg = "[src] [trait_injection_verb] [target] "
switch(zone_sel.selecting)
if(BP_HEAD)
ourmsg += "on the head!"
@@ -27,7 +27,7 @@
toggle_sensors(user)
return
if("internals")
visible_message(span_danger("\The [usr] is trying to set \the [src]'s internals!"))
visible_message(span_danger("\The [user] is trying to set \the [src]'s internals!"))
if(do_after(user,HUMAN_STRIP_DELAY,src))
toggle_internals(user)
return
@@ -38,7 +38,7 @@
var/obj/item/clothing/accessory/A = suit.accessories[1]
if(!istype(A))
return
visible_message(span_danger("\The [usr] is trying to remove \the [src]'s [A.name]!"))
visible_message(span_danger("\The [user] is trying to remove \the [src]'s [A.name]!"))
if(!do_after(user,HUMAN_STRIP_DELAY,src))
return
+1 -1
View File
@@ -305,7 +305,7 @@
switch(action)
if("targetSlot")
H.handle_strip(params["slot"], usr)
H.handle_strip(params["slot"], ui.user)
return TRUE
@@ -50,7 +50,7 @@
return data
/datum/pai_software/directives/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
var/mob/living/silicon/pai/P = usr
var/mob/living/silicon/pai/P = ui.user
if(!istype(P))
return TRUE
if(..())
@@ -160,7 +160,7 @@
/datum/pai_software/med_records/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
. = ..()
var/mob/living/silicon/pai/P = usr
var/mob/living/silicon/pai/P = ui.user
if(!istype(P))
return
@@ -216,7 +216,7 @@
/datum/pai_software/sec_records/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
. = ..()
var/mob/living/silicon/pai/P = usr
var/mob/living/silicon/pai/P = ui.user
if(!istype(P))
return
@@ -267,7 +267,7 @@
return data
/datum/pai_software/door_jack/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
var/mob/living/silicon/pai/P = usr
var/mob/living/silicon/pai/P = ui.user
if(!istype(P) || ..())
return TRUE
@@ -482,7 +482,7 @@
if(..())
return TRUE
var/mob/living/silicon/pai/user = usr
var/mob/living/silicon/pai/user = ui.user
if(istype(user))
var/obj/item/radio/integrated/signal/R = user.sradio
@@ -64,7 +64,7 @@
return data
/obj/machinery/computer/drone_control/tgui_act(action, params)
/obj/machinery/computer/drone_control/tgui_act(action, params, datum/tgui/ui)
if(..())
return TRUE
@@ -75,10 +75,10 @@
return
drone_call_area = t_area
to_chat(usr, span_notice("You set the area selector to [drone_call_area]."))
to_chat(ui.user, span_notice("You set the area selector to [drone_call_area]."))
if("ping")
to_chat(usr, span_notice("You issue a maintenance request for all active drones, highlighting [drone_call_area]."))
to_chat(ui.user, span_notice("You issue a maintenance request for all active drones, highlighting [drone_call_area]."))
for(var/mob/living/silicon/robot/drone/D in player_list)
if(D.stat == 0)
to_chat(D, "-- Maintenance drone presence requested in: [drone_call_area].")
@@ -87,16 +87,16 @@
var/mob/living/silicon/robot/drone/D = locate(params["ref"])
if(D.stat != 2)
to_chat(usr, span_danger("You issue a law synchronization directive for the drone."))
to_chat(ui.user, span_danger("You issue a law synchronization directive for the drone."))
D.law_resync()
if("shutdown")
var/mob/living/silicon/robot/drone/D = locate(params["ref"])
if(D.stat != 2)
to_chat(usr, span_danger("You issue a kill command for the unfortunate drone."))
message_admins("[key_name_admin(usr)] issued kill order for drone [key_name_admin(D)] from control console.")
log_game("[key_name(usr)] issued kill order for [key_name(src)] from control console.")
to_chat(ui.user, span_danger("You issue a kill command for the unfortunate drone."))
message_admins("[key_name_admin(ui.user)] issued kill order for drone [key_name_admin(D)] from control console.")
log_game("[key_name(ui.user)] issued kill order for [key_name(src)] from control console.")
D.shut_down()
if("search_fab")
@@ -108,10 +108,10 @@
continue
dronefab = fab
to_chat(usr, span_notice("Drone fabricator located."))
to_chat(ui.user, span_notice("Drone fabricator located."))
return
to_chat(usr, span_danger("Unable to locate drone fabricator."))
to_chat(ui.user, span_danger("Unable to locate drone fabricator."))
if("toggle_fab")
if(!dronefab)
@@ -119,8 +119,8 @@
if(get_dist(src,dronefab) > 3)
dronefab = null
to_chat(usr, span_danger("Unable to locate drone fabricator."))
to_chat(ui.user, span_danger("Unable to locate drone fabricator."))
return
dronefab.produce_drones = !dronefab.produce_drones
to_chat(usr, span_notice("You [dronefab.produce_drones ? "enable" : "disable"] drone production in the nearby fabricator."))
to_chat(ui.user, span_notice("You [dronefab.produce_drones ? "enable" : "disable"] drone production in the nearby fabricator."))
@@ -108,7 +108,7 @@
return data
/datum/tgui_module/robot_ui/tgui_act(action, params)
/datum/tgui_module/robot_ui/tgui_act(action, params, datum/tgui/ui)
. = ..()
if(.)
return
@@ -130,13 +130,13 @@
if(istype(C))
C.toggled = !C.toggled
if(C.toggled)
to_chat(usr, span_notice("You enable [C]."))
to_chat(ui.user, span_notice("You enable [C]."))
else
to_chat(usr, span_warning("You disable [C]."))
to_chat(ui.user, span_warning("You disable [C]."))
. = TRUE
if("toggle_module")
if(R.weapon_lock)
to_chat(usr, span_danger("Error: Modules locked."))
to_chat(ui.user, span_danger("Error: Modules locked."))
return
var/obj/item/module = locate(params["ref"])
if(istype(module))
@@ -1,23 +1,39 @@
// Phase shifting procs (and related procs)
/mob/living/simple_mob/shadekin/proc/phase_shift()
var/turf/T = get_turf(src)
var/area/A = T.loc //RS Port #658
if(!T.CanPass(src,T) || loc != T)
to_chat(src,span_warning("You can't use that here!"))
return FALSE
forceMove(T)
var/original_canmove = canmove
SetStunned(0)
SetWeakened(0)
if(buckled)
buckled.unbuckle_mob()
if(pulledby)
pulledby.stop_pulling()
stop_pulling()
canmove = FALSE
//RS Port #658 Start
if(!client?.holder && A.block_phase_shift)
to_chat(src,span_warning("You can't use that here!"))
return FALSE
//RS Port #658 End
//Shifting in
if(ability_flags & AB_PHASE_SHIFTED)
phase_in(T)
//Shifting out
else
phase_out(T)
/mob/living/simple_mob/shadekin/proc/phase_in(var/turf/T)
if(ability_flags & AB_PHASE_SHIFTED)
// pre-change
forceMove(T)
var/original_canmove = canmove
SetStunned(0)
SetWeakened(0)
if(buckled)
buckled.unbuckle_mob()
if(pulledby)
pulledby.stop_pulling()
stop_pulling()
canmove = FALSE
// change
ability_flags &= ~AB_PHASE_SHIFTED
mouse_opacity = 1
name = real_name
@@ -67,8 +83,22 @@
else
L.flicker(10)
//Shifting out
else
/mob/living/simple_mob/shadekin/proc/phase_out(var/turf/T)
if(!(ability_flags & AB_PHASE_SHIFTED))
// pre-change
forceMove(T)
var/original_canmove = canmove
SetStunned(0)
SetWeakened(0)
if(buckled)
buckled.unbuckle_mob()
if(pulledby)
pulledby.stop_pulling()
stop_pulling()
canmove = FALSE
// change
ability_flags |= AB_PHASE_SHIFTED
mouse_opacity = 0
custom_emote(1,"phases out!")
+16 -3
View File
@@ -350,14 +350,27 @@
switch(mob.incorporeal_move)
if(1)
var/turf/T = get_step(mob, direct)
var/area/A = T.loc //RS Port #658
if(!T)
return
if(mob.check_holy(T))
to_chat(mob, span_warning("You cannot get past holy grounds while you are in this plane of existence!"))
return
else
mob.forceMove(get_step(mob, direct))
mob.dir = direct
//RS Port #658 Start
if(!holder)
if(isliving(mob) && A.block_phase_shift)
to_chat(mob, span_warning("Something blocks you from entering this location while phased out."))
return
if(isobserver(mob) && A.block_ghosts)
to_chat(mob, span_warning("Ghosts can't enter this location."))
var/area/our_area = mobloc.loc
if(our_area.block_ghosts)
var/mob/observer/dead/D = mob
D.return_to_spawn()
return
mob.forceMove(get_step(mob, direct))
mob.dir = direct
//RS Port #658 End
if(2)
if(prob(50))
var/locx
+6 -1
View File
@@ -17,6 +17,8 @@
set name = "Say"
set category = "IC.Chat"
set hidden = 1
set instant = TRUE
//VOREStation Addition Start
if(forced_psay)
psay(message)
@@ -24,7 +26,10 @@
//VOREStation Addition End
client?.stop_thinking()
usr.say(message)
//queue this message because verbs are scheduled to process after SendMaps in the tick and speech is pretty expensive when it happens.
//by queuing this for next tick the mc can compensate for its cost instead of having speech delay the start of the next tick
if(message)
QUEUE_OR_CALL_VERB_FOR(VERB_CALLBACK(src, TYPE_PROC_REF(/mob, say), message), SSspeech_controller)
/mob/verb/me_verb(message as message)
set name = "Me"