mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-25 04:57:12 +01:00
Merge remote-tracking branch 'upstream/master' into health_data-performance
This commit is contained in:
@@ -121,3 +121,8 @@ SUBSYSTEM_DEF(input)
|
||||
for(var/i in 1 to clients.len)
|
||||
var/client/C = clients[i]
|
||||
C.keyLoop()
|
||||
|
||||
/datum/controller/subsystem/input/Recover()
|
||||
macro_sets = SSinput.macro_sets
|
||||
movement_keys = SSinput.movement_keys
|
||||
alt_movement_keys = SSinput.alt_movement_keys
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
/datum/component/swarming
|
||||
var/offset_x = 0
|
||||
var/offset_y = 0
|
||||
var/is_swarming = FALSE
|
||||
var/list/swarm_members = list()
|
||||
|
||||
/datum/component/swarming/Initialize(max_x = 24, max_y = 24)
|
||||
if(!ismovableatom(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
offset_x = rand(-max_x, max_x)
|
||||
offset_y = rand(-max_y, max_y)
|
||||
|
||||
RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, .proc/join_swarm)
|
||||
RegisterSignal(parent, COMSIG_MOVABLE_UNCROSSED, .proc/leave_swarm)
|
||||
|
||||
/datum/component/swarming/Destroy()
|
||||
for(var/other in swarm_members)
|
||||
var/datum/component/swarming/other_swarm = other
|
||||
other_swarm.swarm_members -= src
|
||||
if(!other_swarm.swarm_members.len)
|
||||
other_swarm.unswarm()
|
||||
swarm_members = null
|
||||
return ..()
|
||||
|
||||
/datum/component/swarming/proc/join_swarm(datum/source, atom/movable/AM)
|
||||
var/datum/component/swarming/other_swarm = AM.GetComponent(/datum/component/swarming)
|
||||
if(!other_swarm)
|
||||
return
|
||||
swarm()
|
||||
swarm_members |= other_swarm
|
||||
other_swarm.swarm()
|
||||
other_swarm.swarm_members |= src
|
||||
|
||||
/datum/component/swarming/proc/leave_swarm(datum/source, atom/movable/AM)
|
||||
var/datum/component/swarming/other_swarm = AM.GetComponent(/datum/component/swarming)
|
||||
if(!other_swarm || !(other_swarm in swarm_members))
|
||||
return
|
||||
swarm_members -= other_swarm
|
||||
if(!swarm_members.len)
|
||||
unswarm()
|
||||
other_swarm.swarm_members -= src
|
||||
if(!other_swarm.swarm_members.len)
|
||||
other_swarm.unswarm()
|
||||
|
||||
/datum/component/swarming/proc/swarm()
|
||||
var/atom/movable/owner = parent
|
||||
if(!is_swarming)
|
||||
is_swarming = TRUE
|
||||
animate(owner, pixel_x = owner.pixel_x + offset_x, pixel_y = owner.pixel_y + offset_y, time = 2)
|
||||
|
||||
/datum/component/swarming/proc/unswarm()
|
||||
var/atom/movable/owner = parent
|
||||
if(is_swarming)
|
||||
animate(owner, pixel_x = owner.pixel_x - offset_x, pixel_y = owner.pixel_y - offset_y, time = 2)
|
||||
is_swarming = FALSE
|
||||
@@ -233,6 +233,9 @@
|
||||
SEND_SIGNAL(src, COMSIG_MOVABLE_CROSSED, AM)
|
||||
SEND_SIGNAL(AM, COMSIG_CROSSED_MOVABLE, src)
|
||||
|
||||
/atom/movable/Uncrossed(atom/movable/AM)
|
||||
SEND_SIGNAL(src, COMSIG_MOVABLE_UNCROSSED, AM)
|
||||
|
||||
/atom/movable/Bump(atom/A, yes) //the "yes" arg is to differentiate our Bump proc from byond's, without it every Bump() call would become a double Bump().
|
||||
if(A && yes)
|
||||
SEND_SIGNAL(src, COMSIG_MOVABLE_BUMP, A)
|
||||
@@ -493,7 +496,7 @@
|
||||
target.fingerprintshidden += fingerprintshidden
|
||||
target.fingerprintslast = fingerprintslast
|
||||
|
||||
/atom/movable/proc/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect, end_pixel_y)
|
||||
/atom/movable/proc/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect)
|
||||
if(!no_effect && (visual_effect_icon || used_item))
|
||||
do_item_attack_animation(A, visual_effect_icon, used_item)
|
||||
|
||||
@@ -501,10 +504,6 @@
|
||||
return //don't do an animation if attacking self
|
||||
var/pixel_x_diff = 0
|
||||
var/pixel_y_diff = 0
|
||||
var/final_pixel_y = initial(pixel_y)
|
||||
if(end_pixel_y)
|
||||
final_pixel_y = end_pixel_y
|
||||
|
||||
var/direction = get_dir(src, A)
|
||||
if(direction & NORTH)
|
||||
pixel_y_diff = 8
|
||||
@@ -517,7 +516,7 @@
|
||||
pixel_x_diff = -8
|
||||
|
||||
animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, time = 2)
|
||||
animate(pixel_x = initial(pixel_x), pixel_y = final_pixel_y, time = 2)
|
||||
animate(pixel_x = pixel_x - pixel_x_diff, pixel_y = pixel_y - pixel_y_diff, time = 2)
|
||||
|
||||
/atom/movable/proc/do_item_attack_animation(atom/A, visual_effect_icon, obj/item/used_item)
|
||||
var/image/I
|
||||
|
||||
@@ -321,7 +321,7 @@
|
||||
|
||||
if(INTENT_GRAB)
|
||||
C.visible_message("<span class='danger'>[L] is grabbed by [H]'s tentacle!</span>","<span class='userdanger'>A tentacle grabs you and pulls you towards [H]!</span>")
|
||||
add_attack_logs(src, C, "[src] has grabbed [C] and pulled them towards [H] with a tentacle")
|
||||
add_attack_logs(H, C, "[H] grabbed [C] with a changeling tentacle")
|
||||
C.throw_at(get_step_towards(H,C), 8, 2, callback=CALLBACK(H, /mob/proc/tentacle_grab, C))
|
||||
return 1
|
||||
|
||||
|
||||
@@ -180,15 +180,19 @@
|
||||
input = stripped_input(src, "Please enter a message to tell your summoner.", "Guardian", "")
|
||||
else
|
||||
input = message
|
||||
if(!input) return
|
||||
if(!input)
|
||||
return
|
||||
|
||||
for(var/mob/M in GLOB.mob_list)
|
||||
if(M == summoner)
|
||||
to_chat(M, "<span class='changeling'><i>[src]:</i> [input]</span>")
|
||||
log_say("(GUARDIAN to [key_name(M)]) [input]", src)
|
||||
else if(M in GLOB.dead_mob_list && M.client && M.stat == DEAD && !isnewplayer(M))
|
||||
to_chat(M, "<span class='changeling'><i>Guardian Communication from <b>[src]</b> ([ghost_follow_link(src, ghost=M)]): [input]</i>")
|
||||
// Show the message to the host and to the guardian.
|
||||
to_chat(summoner, "<span class='changeling'><i>[src]:</i> [input]</span>")
|
||||
to_chat(src, "<span class='changeling'><i>[src]:</i> [input]</span>")
|
||||
log_say("(GUARDIAN to [key_name(summoner)]) [input]", src)
|
||||
create_log(SAY_LOG, "GUARDIAN to HOST: [input]", summoner)
|
||||
|
||||
// Show the message to any ghosts/dead players.
|
||||
for(var/mob/M in GLOB.dead_mob_list)
|
||||
if(M && M.client && M.stat == DEAD && !isnewplayer(M))
|
||||
to_chat(M, "<span class='changeling'><i>Guardian Communication from <b>[src]</b> ([ghost_follow_link(src, ghost=M)]): [input]</i>")
|
||||
|
||||
//override set to true if message should be passed through instead of going to host communication
|
||||
/mob/living/simple_animal/hostile/guardian/say(message, override = FALSE)
|
||||
@@ -206,18 +210,24 @@
|
||||
set category = "Guardian"
|
||||
set desc = "Communicate telepathically with your guardian."
|
||||
var/input = stripped_input(src, "Please enter a message to tell your guardian.", "Message", "")
|
||||
if(!input) return
|
||||
if(!input)
|
||||
return
|
||||
|
||||
for(var/mob/M in GLOB.mob_list)
|
||||
if(istype(M, /mob/living/simple_animal/hostile/guardian))
|
||||
var/mob/living/simple_animal/hostile/guardian/G = M
|
||||
if(G.summoner == src)
|
||||
to_chat(G, "<span class='changeling'><i>[src]:</i> [input]</span>")
|
||||
log_say("(GUARDIAN to [key_name(G)]) [input]", src)
|
||||
// Find the guardian in our host's contents.
|
||||
var/mob/living/simple_animal/hostile/guardian/G = locate() in contents
|
||||
if(!G)
|
||||
return
|
||||
|
||||
else if(M in GLOB.dead_mob_list && M.client && M.stat == DEAD && !isnewplayer(M))
|
||||
to_chat(M, "<span class='changeling'><i>Guardian Communication from <b>[src]</b> ([ghost_follow_link(src, ghost=M)]): [input]</i>")
|
||||
// Show the message to our guardian and to host.
|
||||
to_chat(G, "<span class='changeling'><i>[src]:</i> [input]</span>")
|
||||
to_chat(src, "<span class='changeling'><i>[src]:</i> [input]</span>")
|
||||
log_say("(GUARDIAN to [key_name(G)]) [input]", src)
|
||||
create_log(SAY_LOG, "HOST to GUARDIAN: [input]", G)
|
||||
|
||||
// Show the message to any ghosts/dead players.
|
||||
for(var/mob/M in GLOB.dead_mob_list)
|
||||
if(M && M.client && M.stat == DEAD && !isnewplayer(M))
|
||||
to_chat(M, "<span class='changeling'><i>Guardian Communication from <b>[src]</b> ([ghost_follow_link(src, ghost=M)]): [input]</i>")
|
||||
|
||||
/mob/living/proc/guardian_recall()
|
||||
set name = "Recall Guardian"
|
||||
|
||||
@@ -171,6 +171,8 @@ GLOBAL_LIST_EMPTY(tcomms_machines)
|
||||
var/vname
|
||||
/// List of all channels this can be sent or recieved on
|
||||
var/list/zlevels = list()
|
||||
/// Should this signal be re-broadcasted (Can be modified by NTTC, defaults to TRUE)
|
||||
var/pass = TRUE
|
||||
|
||||
/**
|
||||
* Destructor for the TCM datum.
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#define UI_TAB_CONFIG "CONFIG"
|
||||
#define UI_TAB_LINKS "LINKS"
|
||||
#define UI_TAB_FILTER "FILTER"
|
||||
|
||||
/**
|
||||
* # Telecommunications Core
|
||||
@@ -81,6 +82,11 @@
|
||||
// Now we can run NTTC
|
||||
tcm = nttc.modify_message(tcm)
|
||||
|
||||
// If the signal shouldnt be broadcast, dont broadcast it
|
||||
if(!tcm.pass)
|
||||
// We still return TRUE here because the signal was handled, even though we didnt broadcast
|
||||
return TRUE
|
||||
|
||||
// Now we generate the list of where that signal should go to
|
||||
tcm.zlevels = reachable_zlevels
|
||||
tcm.zlevels |= tcm.source_level
|
||||
@@ -168,6 +174,9 @@
|
||||
data["entries"] += list(list("addr" = "\ref[R]", "net_id" = R.network_id, "sector" = R.loc.z, "status" = status, "status_color" = status_color))
|
||||
// End the shit
|
||||
|
||||
if(ui_tab == UI_TAB_FILTER)
|
||||
data["filtered_users"] = nttc.filtering
|
||||
|
||||
return data
|
||||
|
||||
/obj/machinery/tcomms/core/Topic(href, href_list)
|
||||
@@ -177,7 +186,7 @@
|
||||
|
||||
if(href_list["tab"])
|
||||
// Make sure its a valid tab
|
||||
if(href_list["tab"] in list(UI_TAB_CONFIG, UI_TAB_LINKS))
|
||||
if(href_list["tab"] in list(UI_TAB_CONFIG, UI_TAB_LINKS, UI_TAB_FILTER))
|
||||
ui_tab = href_list["tab"]
|
||||
|
||||
// Check if they did a href, but only for that current tab
|
||||
@@ -257,9 +266,35 @@
|
||||
to_chat(usr, "<span class='notice'>Successfully changed password from <b>[link_password]</b> to <b>[new_password]</b>.</span>")
|
||||
link_password = new_password
|
||||
|
||||
if(ui_tab == UI_TAB_FILTER)
|
||||
if(href_list["add_filter"])
|
||||
// This is a stripped input because I did NOT come this far for this system to be abused by HTML injection
|
||||
var/name_to_add = stripped_input(usr, "Enter a name to add to the filtering list", "Name Entry")
|
||||
if(name_to_add == "")
|
||||
return
|
||||
if(name_to_add in nttc.filtering)
|
||||
to_chat(usr, "<span class='alert'><b>ERROR:</b> User already in filtering list.</span>")
|
||||
else
|
||||
nttc.filtering |= name_to_add
|
||||
log_action(usr, "has added [name_to_add] to the NTTC filter list on core with ID [network_id]", TRUE)
|
||||
to_chat(usr, "<span class='notice'>Successfully added <b>[name_to_add]</b> to the NTTC filtering list.</span>")
|
||||
|
||||
|
||||
if(href_list["remove_filter"])
|
||||
var/name_to_remove = href_list["remove_filter"]
|
||||
if(!(name_to_remove in nttc.filtering))
|
||||
to_chat(usr, "<span class='alert'><b>ERROR:</b> Name does not exist in filter list. Please file an issue report.</span>")
|
||||
else
|
||||
var/confirm = alert(usr, "Are you sure you want to remove [name_to_remove] from the filtering list?", "Confirm Removal", "Yes", "No")
|
||||
if(confirm == "Yes")
|
||||
nttc.filtering -= name_to_remove
|
||||
log_action(usr, "has removed [name_to_remove] from the NTTC filter list on core with ID [network_id]", TRUE)
|
||||
to_chat(usr, "<span class='notice'>Successfully removed <b>[name_to_remove]</b> from the NTTC filtering list.</span>")
|
||||
|
||||
|
||||
// Hack to speed update the nanoUI
|
||||
SSnanoui.update_uis(src)
|
||||
|
||||
#undef UI_TAB_CONFIG
|
||||
#undef UI_TAB_LINKS
|
||||
#undef UI_TAB_FILTER
|
||||
|
||||
@@ -153,6 +153,10 @@
|
||||
var/list/job_card_styles = list(
|
||||
JOB_STYLE_1, JOB_STYLE_2, JOB_STYLE_3, JOB_STYLE_4
|
||||
)
|
||||
|
||||
// List of people who will get blocked out of comms
|
||||
var/list/filtering = list()
|
||||
|
||||
// Used to determine what languages are allowable for conversion. Generated during runtime.
|
||||
var/list/valid_languages = list("--DISABLE--")
|
||||
|
||||
@@ -220,6 +224,9 @@
|
||||
|
||||
// Primary signal modification. This is where all of the variables behavior are actually implemented.
|
||||
/datum/nttc_configuration/proc/modify_message(datum/tcomms_message/tcm)
|
||||
// Check if they should be blacklisted right off the bat. We can save CPU if the message wont even be processed
|
||||
if(tcm.sender_name in filtering)
|
||||
tcm.pass = FALSE
|
||||
// All job and coloring shit
|
||||
if(toggle_job_color || toggle_name_color)
|
||||
var/job = tcm.sender_job
|
||||
|
||||
@@ -1456,7 +1456,7 @@
|
||||
|
||||
..()
|
||||
|
||||
/obj/mecha/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect, end_pixel_y)
|
||||
/obj/mecha/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect)
|
||||
if(!no_effect)
|
||||
if(selected)
|
||||
used_item = selected
|
||||
|
||||
@@ -98,6 +98,7 @@
|
||||
pixel_x = rand(6,-6)
|
||||
pixel_y = rand(6,-6)
|
||||
START_PROCESSING(SSobj, src)
|
||||
AddComponent(/datum/component/swarming)
|
||||
|
||||
/obj/structure/spider/spiderling/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
|
||||
@@ -59,8 +59,7 @@
|
||||
cooldown--
|
||||
if(cooldown <= 0)
|
||||
return FALSE
|
||||
spawn(10)
|
||||
process_cooldown()
|
||||
addtimer(CALLBACK(src, .proc/process_cooldown), 10)
|
||||
return TRUE
|
||||
|
||||
/obj/item/assembly/Destroy()
|
||||
@@ -94,8 +93,7 @@
|
||||
if(!secured || cooldown > 0)
|
||||
return FALSE
|
||||
cooldown = 2
|
||||
spawn(10)
|
||||
process_cooldown()
|
||||
addtimer(CALLBACK(src, .proc/process_cooldown), 10)
|
||||
return TRUE
|
||||
|
||||
/obj/item/assembly/toggle_secure()
|
||||
|
||||
@@ -127,13 +127,12 @@
|
||||
/obj/item/assembly/infra/proc/trigger_beam()
|
||||
if(!secured || !on || cooldown > 0)
|
||||
return FALSE
|
||||
pulse(0)
|
||||
cooldown = 2
|
||||
pulse(FALSE)
|
||||
audible_message("[bicon(src)] *beep* *beep*", null, 3)
|
||||
if(first)
|
||||
qdel(first)
|
||||
cooldown = 2
|
||||
spawn(10)
|
||||
process_cooldown()
|
||||
addtimer(CALLBACK(src, .proc/process_cooldown), 10)
|
||||
|
||||
/obj/item/assembly/infra/interact(mob/user)//TODO: change this this to the wire control panel
|
||||
if(!secured) return
|
||||
|
||||
@@ -47,11 +47,10 @@
|
||||
/obj/item/assembly/prox_sensor/proc/sense()
|
||||
if(!secured || !scanning || cooldown > 0)
|
||||
return FALSE
|
||||
pulse(0)
|
||||
visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*")
|
||||
cooldown = 2
|
||||
spawn(10)
|
||||
process_cooldown()
|
||||
pulse(FALSE)
|
||||
visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*")
|
||||
addtimer(CALLBACK(src, .proc/process_cooldown), 10)
|
||||
|
||||
/obj/item/assembly/prox_sensor/process()
|
||||
if(timing && (time >= 0))
|
||||
|
||||
@@ -41,8 +41,7 @@
|
||||
if(cooldown > 0)
|
||||
return FALSE
|
||||
cooldown = 2
|
||||
spawn(10)
|
||||
process_cooldown()
|
||||
addtimer(CALLBACK(src, .proc/process_cooldown), 10)
|
||||
|
||||
signal()
|
||||
return TRUE
|
||||
|
||||
@@ -39,12 +39,11 @@
|
||||
/obj/item/assembly/timer/proc/timer_end()
|
||||
if(!secured || cooldown > 0)
|
||||
return FALSE
|
||||
pulse(0)
|
||||
cooldown = 2
|
||||
pulse(FALSE)
|
||||
if(loc)
|
||||
loc.visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*")
|
||||
cooldown = 2
|
||||
spawn(10)
|
||||
process_cooldown()
|
||||
addtimer(CALLBACK(src, .proc/process_cooldown), 10)
|
||||
|
||||
/obj/item/assembly/timer/process()
|
||||
if(timing && (time > 0))
|
||||
|
||||
@@ -154,12 +154,6 @@
|
||||
T.on_consume(src, usr)
|
||||
..()
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/Crossed(atom/movable/AM, oldloc)
|
||||
if(seed)
|
||||
for(var/datum/plant_gene/trait/T in seed.genes)
|
||||
T.on_cross(src, AM)
|
||||
..()
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/after_slip(mob/living/carbon/human/H)
|
||||
if(!seed)
|
||||
return
|
||||
|
||||
@@ -50,13 +50,6 @@
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
/obj/item/grown/Crossed(atom/movable/AM, oldloc)
|
||||
if(seed)
|
||||
for(var/datum/plant_gene/trait/T in seed.genes)
|
||||
T.on_cross(src, AM)
|
||||
..()
|
||||
|
||||
/obj/item/grown/after_slip(mob/living/carbon/human/H)
|
||||
if(!seed)
|
||||
return
|
||||
|
||||
@@ -175,9 +175,6 @@
|
||||
/datum/plant_gene/trait/proc/on_consume(obj/item/reagent_containers/food/snacks/grown/G, mob/living/carbon/target)
|
||||
return
|
||||
|
||||
/datum/plant_gene/trait/proc/on_cross(obj/item/reagent_containers/food/snacks/grown/G, atom/target)
|
||||
return
|
||||
|
||||
/datum/plant_gene/trait/proc/on_slip(obj/item/reagent_containers/food/snacks/grown/G, mob/living/carbon/target)
|
||||
return
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has attempted to disarm [src]!</span>")
|
||||
|
||||
/mob/living/carbon/alien/humanoid/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect, end_pixel_y)
|
||||
/mob/living/carbon/alien/humanoid/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect)
|
||||
if(!no_effect && !visual_effect_icon)
|
||||
visual_effect_icon = ATTACK_EFFECT_CLAW
|
||||
..()
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
step_away(src, user, 15)
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/alien/larva/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect, end_pixel_y)
|
||||
/mob/living/carbon/alien/larva/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect)
|
||||
if(!no_effect && !visual_effect_icon)
|
||||
visual_effect_icon = ATTACK_EFFECT_BITE
|
||||
..()
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
visible_message("<span class='warning'>[src] catches [AM]!</span>")
|
||||
throw_mode_off()
|
||||
return TRUE
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/water_act(volume, temperature, source, method = REAGENT_TOUCH)
|
||||
. = ..()
|
||||
|
||||
@@ -740,7 +740,8 @@
|
||||
clear_alert("weightless")
|
||||
else
|
||||
throw_alert("weightless", /obj/screen/alert/weightless)
|
||||
float(!has_gravity)
|
||||
if(!flying)
|
||||
float(!has_gravity)
|
||||
|
||||
/mob/living/proc/float(on)
|
||||
if(throwing)
|
||||
@@ -825,8 +826,7 @@
|
||||
spawn_dust()
|
||||
gib()
|
||||
|
||||
/mob/living/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect, end_pixel_y)
|
||||
end_pixel_y = get_standard_pixel_y_offset(lying)
|
||||
/mob/living/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect)
|
||||
if(!used_item)
|
||||
used_item = get_active_hand()
|
||||
..()
|
||||
|
||||
@@ -336,7 +336,8 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
var/datum/multilingual_say_piece/S = message_pieces // Yay BYOND's hilarious typecasting
|
||||
S.speaking.broadcast(src, S.message)
|
||||
return 1
|
||||
|
||||
// Log it here since it skips the default way say handles it
|
||||
create_log(SAY_LOG, "(whisper) '[message]'")
|
||||
whisper_say(message_pieces)
|
||||
|
||||
// for weird circumstances where you're inside an atom that is also you, like pai's
|
||||
|
||||
@@ -118,7 +118,7 @@
|
||||
/mob/living/simple_animal/blob_act(obj/structure/blob/B)
|
||||
adjustBruteLoss(20)
|
||||
|
||||
/mob/living/simple_animal/do_attack_animation(atom/A, visual_effect_icon, used_item, no_effect, end_pixel_y)
|
||||
/mob/living/simple_animal/do_attack_animation(atom/A, visual_effect_icon, used_item, no_effect)
|
||||
if(!no_effect && !visual_effect_icon && melee_damage_upper)
|
||||
if(melee_damage_upper < 10)
|
||||
visual_effect_icon = ATTACK_EFFECT_PUNCH
|
||||
|
||||
@@ -60,6 +60,7 @@
|
||||
/mob/living/simple_animal/hostile/poison/bees/New()
|
||||
..()
|
||||
generate_bee_visuals()
|
||||
AddComponent(/datum/component/swarming)
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/Destroy()
|
||||
beegent = null
|
||||
|
||||
@@ -90,6 +90,7 @@
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/Initialize(mapload)
|
||||
. = ..()
|
||||
addtimer(CALLBACK(src, .proc/death), 100)
|
||||
AddComponent(/datum/component/swarming)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood
|
||||
|
||||
@@ -335,7 +335,7 @@
|
||||
|
||||
|
||||
//Jiggle the whole worm forwards towards the next segment
|
||||
/mob/living/simple_animal/hostile/spaceWorm/do_attack_animation(atom/A, visual_effect_icon, used_item, no_effect, end_pixel_y)
|
||||
/mob/living/simple_animal/hostile/spaceWorm/do_attack_animation(atom/A, visual_effect_icon, used_item, no_effect)
|
||||
..()
|
||||
if(previousWorm)
|
||||
previousWorm.do_attack_animation(src)
|
||||
|
||||
@@ -349,7 +349,8 @@
|
||||
icon = 'icons/mob/critter.dmi'
|
||||
icon_state = "viscerator_attack"
|
||||
icon_living = "viscerator_attack"
|
||||
pass_flags = PASSTABLE
|
||||
pass_flags = PASSTABLE | PASSMOB
|
||||
a_intent = INTENT_HARM
|
||||
health = 15
|
||||
maxHealth = 15
|
||||
obj_damage = 0
|
||||
@@ -365,3 +366,7 @@
|
||||
gold_core_spawnable = HOSTILE_SPAWN
|
||||
del_on_death = 1
|
||||
deathmessage = "is smashed into pieces!"
|
||||
|
||||
/mob/living/simple_animal/hostile/viscerator/Initialize(mapload)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/swarming)
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
. += "<span class='warning'>[src] appears to be having trouble staying afloat!</span>"
|
||||
|
||||
|
||||
/mob/living/simple_animal/possessed_object/do_attack_animation(atom/A, visual_effect_icon, used_item, no_effect, end_pixel_y)
|
||||
/mob/living/simple_animal/possessed_object/do_attack_animation(atom/A, visual_effect_icon, used_item, no_effect)
|
||||
..()
|
||||
animate_ghostly_presence(src, -1, 20, 1) // Restart the floating animation after the attack animation, as it will be cancelled.
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{{:helper.link('Device Configuration', 'wrench', {'tab' : "CONFIG"}, data.tab == "CONFIG" ? 'selected' : '')}}
|
||||
{{:helper.link('Device Links', 'link', {'tab' : "LINKS"}, data.tab == "LINKS" ? 'selected' : '')}}
|
||||
{{:helper.link('User Filtering', 'user-times', {'tab' : "FILTER"}, data.tab == "FILTER" ? 'selected' : '')}}
|
||||
|
||||
{{if data.tab == "CONFIG"}}
|
||||
<h1>Core Configuration</h1>
|
||||
@@ -136,4 +137,47 @@
|
||||
{{/for}}
|
||||
</tbody>
|
||||
</table>
|
||||
{{else data.tab == "FILTER"}}
|
||||
<style>
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
table,
|
||||
td,
|
||||
th {
|
||||
border: 1px solid #ffffff;
|
||||
}
|
||||
.infoButton {
|
||||
background: none;
|
||||
border: none;
|
||||
}
|
||||
</style>
|
||||
<h1>Filtering List</h1>
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
{{:helper.link('Add User', 'plus', {'add_filter': 1})}}
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
<table style='width: 100%; text-align: center; background-color: #272727;'>
|
||||
<colgroup>
|
||||
<col span="1" style="width: 90%;">
|
||||
<col span="1" style="width: 10%;">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Remove</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{for data.filtered_users}}
|
||||
<tr>
|
||||
<td>{{:value}}</td>
|
||||
<td>{{:helper.link('Remove', 'times', {'remove_filter' : value}, null, 'infoButton')}}</td>
|
||||
</tr>
|
||||
{{/for}}
|
||||
</tbody>
|
||||
</table>
|
||||
{{/if}}
|
||||
|
||||
@@ -306,6 +306,7 @@
|
||||
#include "code\datums\components\slippery.dm"
|
||||
#include "code\datums\components\spawner.dm"
|
||||
#include "code\datums\components\squeak.dm"
|
||||
#include "code\datums\components\swarming.dm"
|
||||
#include "code\datums\diseases\_disease.dm"
|
||||
#include "code\datums\diseases\_MobProcs.dm"
|
||||
#include "code\datums\diseases\anxiety.dm"
|
||||
|
||||
Reference in New Issue
Block a user