mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-16 18:45:22 +01:00
Merge remote-tracking branch 'tgstation/master' into upstream-2025-11-29
# Conflicts: # _maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm # _maps/RandomRuins/SpaceRuins/garbagetruck2.dmm # _maps/map_files/CatwalkStation/CatwalkStation_2023.dmm # _maps/map_files/tramstation/tramstation.dmm # code/_onclick/hud/new_player.dm # code/datums/components/squashable.dm # code/datums/diseases/advance/symptoms/heal.dm # code/datums/diseases/chronic_illness.dm # code/datums/status_effects/buffs.dm # code/datums/status_effects/debuffs/drunk.dm # code/datums/status_effects/debuffs/stamcrit.dm # code/game/machinery/computer/crew.dm # code/game/objects/items/devices/scanners/health_analyzer.dm # code/game/objects/items/wall_mounted.dm # code/game/turfs/closed/indestructible.dm # code/modules/admin/view_variables/filterrific.dm # code/modules/antagonists/heretic/influences.dm # code/modules/cargo/orderconsole.dm # code/modules/client/preferences.dm # code/modules/events/space_vines/vine_mutations.dm # code/modules/mob/dead/new_player/new_player.dm # code/modules/mob/living/carbon/human/death.dm # code/modules/mob/living/carbon/human/species_types/jellypeople.dm # code/modules/mob/living/damage_procs.dm # code/modules/mob/living/living.dm # code/modules/mob_spawn/ghost_roles/mining_roles.dm # code/modules/mob_spawn/mob_spawn.dm # code/modules/projectiles/ammunition/energy/laser.dm # code/modules/projectiles/guns/ballistic/launchers.dm # code/modules/projectiles/guns/energy/laser.dm # code/modules/reagents/chemistry/machinery/chem_dispenser.dm # code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm # code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm # code/modules/reagents/chemistry/reagents/medicine_reagents.dm # code/modules/surgery/healing.dm # code/modules/unit_tests/designs.dm # icons/mob/inhands/items_lefthand.dmi # icons/mob/inhands/items_righthand.dmi # tgui/packages/tgui/interfaces/ChemDispenser.tsx
This commit is contained in:
+33
-18
@@ -36,29 +36,44 @@
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////ADMIN HELPER PROCS
|
||||
|
||||
ADMIN_VERB(spawn_atom, R_SPAWN, "Spawn", "Spawn an atom.", ADMIN_CATEGORY_DEBUG, object as text)
|
||||
if(!object)
|
||||
return
|
||||
var/list/preparsed = splittext(object,":")
|
||||
var/path = preparsed[1]
|
||||
ADMIN_VERB(spawn_atom, R_SPAWN, "Spawn", "Spawn an atom.", ADMIN_CATEGORY_DEBUG, object as text|null)
|
||||
var/static/list/atom_types
|
||||
if (isnull(atom_types))
|
||||
atom_types = subtypesof(/atom)
|
||||
|
||||
var/chosen_path = null
|
||||
var/list/preparsed = null
|
||||
if (object)
|
||||
preparsed = splittext(object, ":")
|
||||
var/list/matches = filter_fancy_list(atom_types, preparsed[1])
|
||||
if (length(matches) == 1)
|
||||
chosen_path = matches[1]
|
||||
|
||||
if(!chosen_path)
|
||||
var/datum/spawn_menu/menu = user.holder.spawn_menu
|
||||
if (!menu)
|
||||
menu = new()
|
||||
user.holder.spawn_menu = menu
|
||||
menu.init_value = object
|
||||
menu.ui_interact(user.mob)
|
||||
BLACKBOX_LOG_ADMIN_VERB("Spawn Atom")
|
||||
return TRUE
|
||||
|
||||
var/amount = 1
|
||||
if(preparsed.len > 1)
|
||||
amount = clamp(text2num(preparsed[2]),1,ADMIN_SPAWN_CAP)
|
||||
if (length(preparsed) > 1)
|
||||
amount = clamp(text2num(preparsed[2]), 1, ADMIN_SPAWN_CAP)
|
||||
|
||||
var/chosen = pick_closest_path(path)
|
||||
if(!chosen)
|
||||
return
|
||||
var/turf/T = get_turf(user.mob)
|
||||
|
||||
if(ispath(chosen, /turf))
|
||||
T.ChangeTurf(chosen)
|
||||
var/turf/target_turf = get_turf(user.mob)
|
||||
if (ispath(chosen_path, /turf))
|
||||
target_turf.ChangeTurf(chosen_path)
|
||||
else
|
||||
for(var/i in 1 to amount)
|
||||
var/atom/A = new chosen(T)
|
||||
A.flags_1 |= ADMIN_SPAWNED_1
|
||||
for (var/i in 1 to amount)
|
||||
var/atom/spawned = new chosen_path(target_turf)
|
||||
spawned.flags_1 |= ADMIN_SPAWNED_1
|
||||
|
||||
log_admin("[key_name(user)] spawned [amount] x [chosen] at [AREACOORD(user.mob)]")
|
||||
log_admin("[key_name(user.mob)] spawned [amount] x [chosen_path] at [AREACOORD(user.mob)]")
|
||||
BLACKBOX_LOG_ADMIN_VERB("Spawn Atom")
|
||||
return TRUE
|
||||
|
||||
ADMIN_VERB(spawn_atom_pod, R_SPAWN, "PodSpawn", "Spawn an atom via supply drop.", ADMIN_CATEGORY_DEBUG, object as text)
|
||||
var/chosen = pick_closest_path(object)
|
||||
|
||||
@@ -32,12 +32,14 @@ GLOBAL_PROTECT(href_token)
|
||||
|
||||
var/deadmined
|
||||
|
||||
var/datum/filter_editor/filteriffic
|
||||
var/datum/filter_editor/filterrific
|
||||
var/datum/particle_editor/particle_test
|
||||
var/datum/colorblind_tester/color_test
|
||||
var/datum/plane_master_debug/plane_debug
|
||||
var/obj/machinery/computer/libraryconsole/admin_only_do_not_map_in_you_fucker/library_manager
|
||||
var/datum/pathfind_debug/path_debug
|
||||
var/datum/spawn_menu/spawn_menu
|
||||
var/datum/spawnpanel/spawn_panel
|
||||
|
||||
/// Whether or not the user tried to connect, but was blocked by 2FA
|
||||
var/blocked_by_2fa = FALSE
|
||||
|
||||
@@ -4,4 +4,4 @@
|
||||
|
||||
/datum/smite/brain_damage/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
target.adjustOrganLoss(ORGAN_SLOT_BRAIN, BRAIN_DAMAGE_DEATH - 1, BRAIN_DAMAGE_DEATH - 1)
|
||||
target.adjust_organ_loss(ORGAN_SLOT_BRAIN, BRAIN_DAMAGE_DEATH - 1, BRAIN_DAMAGE_DEATH - 1)
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
if (target.health <= 1)
|
||||
target.gib(DROP_BODYPARTS)
|
||||
else
|
||||
target.adjustBruteLoss(min(BSA_MAX_DAMAGE, target.health - 1))
|
||||
target.adjust_brute_loss(min(BSA_MAX_DAMAGE, target.health - 1))
|
||||
target.Paralyze(BSA_PARALYZE_TIME)
|
||||
target.set_stutter(BSA_STUTTER_TIME)
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
/proc/lightningbolt(mob/living/user)
|
||||
var/turf/lightning_source = get_step(get_step(user, NORTH), NORTH)
|
||||
lightning_source.Beam(user, icon_state="lightning[rand(1,12)]", time = 5)
|
||||
user.adjustFireLoss(LIGHTNING_BOLT_DAMAGE)
|
||||
user.adjust_fire_loss(LIGHTNING_BOLT_DAMAGE)
|
||||
playsound(get_turf(user), 'sound/effects/magic/lightningbolt.ogg', 50, TRUE)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/human_target = user
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
/datum/spawn_menu
|
||||
/// Does the menu default to a regex prefix?
|
||||
var/regex_search = FALSE
|
||||
/// Does the search include atom names?
|
||||
var/name_search = TRUE
|
||||
/// Should we display full typepaths or the condensed versions?
|
||||
var/fancy_types = TRUE
|
||||
/// Should abstract types be included in the search?
|
||||
var/include_abstracts = FALSE
|
||||
/// Initial search value from the latest command
|
||||
var/init_value = null
|
||||
|
||||
/datum/spawn_menu/ui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if (!ui)
|
||||
ui = new(user, src, "SpawnSearch")
|
||||
ui.open()
|
||||
|
||||
/datum/spawn_menu/ui_state(mob/user)
|
||||
return ADMIN_STATE(R_SPAWN)
|
||||
|
||||
/datum/spawn_menu/ui_act(action, params, datum/tgui/ui)
|
||||
if (..() || !check_rights_for(ui.user.client, R_SPAWN))
|
||||
return FALSE
|
||||
|
||||
switch (action)
|
||||
if ("setRegexSearch")
|
||||
regex_search = params["regexSearch"]
|
||||
return TRUE
|
||||
|
||||
if ("setNameSearch")
|
||||
name_search = params["searchNames"]
|
||||
return TRUE
|
||||
|
||||
if ("setFancyTypes")
|
||||
fancy_types = params["fancyTypes"]
|
||||
return TRUE
|
||||
|
||||
if ("setIncludeAbstracts")
|
||||
include_abstracts = params["includeAbstracts"]
|
||||
return TRUE
|
||||
|
||||
if ("spawn")
|
||||
var/path = text2path(params["type"])
|
||||
if (!path)
|
||||
return TRUE
|
||||
var/amount = clamp(text2num(params["amount"]) || 1, 1, ADMIN_SPAWN_CAP)
|
||||
var/turf/target_turf = get_turf(ui.user)
|
||||
if(ispath(path, /turf))
|
||||
target_turf.ChangeTurf(path)
|
||||
else
|
||||
for(var/i in 1 to amount)
|
||||
var/atom/spawned = new path(target_turf)
|
||||
spawned.flags_1 |= ADMIN_SPAWNED_1
|
||||
|
||||
log_admin("[key_name(ui.user)] spawned [amount] x [path] at [AREACOORD(ui.user)]")
|
||||
SStgui.close_uis(src)
|
||||
return TRUE
|
||||
|
||||
if ("cancel")
|
||||
SStgui.close_uis(src)
|
||||
return TRUE
|
||||
|
||||
/datum/spawn_menu/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["initValue"] = init_value
|
||||
data["searchNames"] = name_search
|
||||
data["regexSearch"] = regex_search
|
||||
data["fancyTypes"] = fancy_types
|
||||
data["includeAbstracts"] = include_abstracts
|
||||
return data
|
||||
|
||||
/datum/spawn_menu/ui_assets(mob/user)
|
||||
return list(
|
||||
get_asset_datum(/datum/asset/json/spawn_menu),
|
||||
)
|
||||
|
||||
/datum/asset/json/spawn_menu
|
||||
name = "spawn_menu_atom_data"
|
||||
|
||||
/datum/asset/json/spawn_menu/generate()
|
||||
var/list/data = list()
|
||||
var/static/list/types_list
|
||||
if (isnull(types_list))
|
||||
var/list/local_types = list()
|
||||
for (var/atom/atom_type as anything in subtypesof(/atom))
|
||||
local_types[atom_type] = atom_type::name || ""
|
||||
types_list = local_types
|
||||
data["types"] = types_list
|
||||
data["abstractTypes"] = get_abstract_types()
|
||||
data["fancyTypes"] = GLOB.fancy_type_replacements
|
||||
return data
|
||||
@@ -15,14 +15,10 @@
|
||||
#define OFFSET_ABSOLUTE "Absolute offset"
|
||||
#define OFFSET_RELATIVE "Relative offset"
|
||||
|
||||
GLOBAL_LIST_INIT(spawnpanels_by_ckey, list())
|
||||
|
||||
/*
|
||||
An instance of a /tg/UI™ Spawn Panel. Stores preferences, spawns things, controls the UI. Unique for each user (their ckey).
|
||||
*/
|
||||
/datum/spawnpanel
|
||||
/// Who this instance of spawn panel belongs to. The instances are unique to correctly keep modified values between multiple admins.
|
||||
var/owner_ckey
|
||||
/// Where and how the atom should be spawned.
|
||||
var/where_target_type = WHERE_FLOOR_BELOW_MOB
|
||||
/// The atom selected from the panel.
|
||||
@@ -57,45 +53,21 @@ GLOBAL_LIST_INIT(spawnpanels_by_ckey, list())
|
||||
offset = list("X" = 0, "Y" = 0, "Z" = 0)
|
||||
|
||||
/datum/spawnpanel/ui_interact(mob/user, datum/tgui/ui)
|
||||
if(user.client.ckey != owner_ckey)
|
||||
return
|
||||
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "SpawnPanel")
|
||||
ui.open()
|
||||
|
||||
/// Returns a `spawnpanel` instance belonging to this `user`, or creates and registers a new one
|
||||
/proc/get_spawnpanel_for_admin(mob/user)
|
||||
if(!user?.client?.ckey)
|
||||
return null
|
||||
|
||||
var/ckey = user.client.ckey
|
||||
|
||||
if(GLOB.spawnpanels_by_ckey[ckey])
|
||||
return GLOB.spawnpanels_by_ckey[ckey]
|
||||
|
||||
var/datum/spawnpanel/new_panel = new()
|
||||
new_panel.owner_ckey = ckey
|
||||
GLOB.spawnpanels_by_ckey[ckey] = new_panel
|
||||
|
||||
return new_panel
|
||||
|
||||
/datum/spawnpanel/ui_close(mob/user)
|
||||
. = ..()
|
||||
if (precise_mode && precise_mode != PRECISE_MODE_OFF)
|
||||
toggle_precise_mode(PRECISE_MODE_OFF)
|
||||
|
||||
/datum/spawnpanel/ui_state(mob/user)
|
||||
if(user.client.ckey != owner_ckey)
|
||||
return GLOB.never_state
|
||||
return ADMIN_STATE(R_ADMIN)
|
||||
return ADMIN_STATE(R_SPAWN)
|
||||
|
||||
/datum/spawnpanel/ui_act(action, params)
|
||||
if(..())
|
||||
return FALSE
|
||||
|
||||
if(usr.client.ckey != owner_ckey)
|
||||
/datum/spawnpanel/ui_act(action, params, datum/tgui/ui)
|
||||
if(..() || !check_rights_for(ui.user.client, R_SPAWN))
|
||||
return FALSE
|
||||
|
||||
switch(action)
|
||||
@@ -106,12 +78,10 @@ GLOBAL_LIST_INIT(spawnpanels_by_ckey, list())
|
||||
available_icon_states = icon_states(selected_atom_icon)
|
||||
if(!(selected_atom_icon_state in available_icon_states))
|
||||
selected_atom_icon_state = available_icon_states[1]
|
||||
SStgui.update_uis(src)
|
||||
return TRUE
|
||||
|
||||
if("set-apply-icon-override")
|
||||
apply_icon_override = !!params["value"]
|
||||
SStgui.update_uis(src)
|
||||
return TRUE
|
||||
|
||||
if("reset-DMI-icon")
|
||||
@@ -123,35 +93,28 @@ GLOBAL_LIST_INIT(spawnpanels_by_ckey, list())
|
||||
available_icon_states = icon_states(selected_atom_icon)
|
||||
else
|
||||
available_icon_states = list()
|
||||
|
||||
SStgui.update_uis(src)
|
||||
return TRUE
|
||||
|
||||
if("select-new-icon-state")
|
||||
selected_atom_icon_state = params["new_state"]
|
||||
SStgui.update_uis(src)
|
||||
return TRUE
|
||||
|
||||
if("reset-icon-state")
|
||||
selected_atom_icon_state = null
|
||||
if(selected_atom)
|
||||
selected_atom_icon_state = initial(selected_atom.icon_state)
|
||||
SStgui.update_uis(src)
|
||||
return TRUE
|
||||
|
||||
if("set-icon-size")
|
||||
atom_icon_size = params["size"]
|
||||
SStgui.update_uis(src)
|
||||
return TRUE
|
||||
|
||||
if("reset-icon-size")
|
||||
atom_icon_size = 100
|
||||
SStgui.update_uis(src)
|
||||
return TRUE
|
||||
|
||||
if("get-icon-states")
|
||||
available_icon_states = icon_states(selected_atom_icon)
|
||||
SStgui.update_uis(src)
|
||||
return TRUE
|
||||
|
||||
if("selected-atom-changed")
|
||||
|
||||
@@ -44,10 +44,10 @@
|
||||
#define TAG_MARK(X) "<b>(<A href='byond://?_src_=holder;[HrefToken(forceGlobal = TRUE)];mark_datum=[REF(X)]'>MARK</a>)</b>"
|
||||
#define TAG_SIMPLE_HEALTH(X) "<font color='#ff0000'><b>Health: [X.health]</b></font>"
|
||||
#define TAG_CARBON_HEALTH(X) "<font color='#ff0000'><b>Health: [X.health]</b></font> (\
|
||||
<font color='#ff3333'>[X.getBruteLoss()]</font> \
|
||||
<font color='#ff9933'>[X.getFireLoss()]</font> \
|
||||
<font color='#00cc66'>[X.getToxLoss()]</font> \
|
||||
<font color='#00cccc'>[X.getOxyLoss()]</font>"
|
||||
<font color='#ff3333'>[X.get_brute_loss()]</font> \
|
||||
<font color='#ff9933'>[X.get_fire_loss()]</font> \
|
||||
<font color='#00cc66'>[X.get_tox_loss()]</font> \
|
||||
<font color='#00cccc'>[X.get_oxy_loss()]</font>"
|
||||
|
||||
ADMIN_VERB(display_tags, R_ADMIN, "View Tags", "Display all of the tagged datums.", ADMIN_CATEGORY_GAME)
|
||||
var/index = 0
|
||||
|
||||
@@ -731,8 +731,8 @@
|
||||
if(DEAD)
|
||||
status = "<font color='red'><b>Dead</b></font>"
|
||||
health_description = "Status: [status]"
|
||||
health_description += "<br>Brute: [lifer.getBruteLoss()] - Burn: [lifer.getFireLoss()] - Toxin: [lifer.getToxLoss()] - Suffocation: [lifer.getOxyLoss()]"
|
||||
health_description += "<br>Brain: [lifer.get_organ_loss(ORGAN_SLOT_BRAIN)] - Stamina: [lifer.getStaminaLoss()]"
|
||||
health_description += "<br>Brute: [lifer.get_brute_loss()] - Burn: [lifer.get_fire_loss()] - Toxin: [lifer.get_tox_loss()] - Suffocation: [lifer.get_oxy_loss()]"
|
||||
health_description += "<br>Brain: [lifer.get_organ_loss(ORGAN_SLOT_BRAIN)] - Stamina: [lifer.get_stamina_loss()]"
|
||||
else
|
||||
health_description = "This mob type has no health to speak of."
|
||||
|
||||
@@ -946,6 +946,16 @@
|
||||
return
|
||||
M.get_language_holder().open_language_menu(usr)
|
||||
|
||||
else if(href_list["rpreminder"])
|
||||
var/mob/rper = locate(href_list["rpreminder"]) in GLOB.player_list
|
||||
if(QDELETED(rper))
|
||||
return
|
||||
// literally just gives them a sound and a message
|
||||
SEND_SOUND(rper, sound('sound/misc/roleplay.ogg'))
|
||||
to_chat(rper, boxed_message("You hear a nagging voice in your head... [span_hypnophrase("Please roleplay appropriately.")]"))
|
||||
message_admins("[ADMIN_LOOKUPFLW(usr)] reminded [ADMIN_LOOKUPFLW(rper)] to roleplay appropriately.")
|
||||
log_admin("[key_name(usr)] reminded [key_name(rper)] to roleplay appropriately.")
|
||||
|
||||
else if(href_list["traitor"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
@@ -129,7 +129,8 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(show_player_panel, R_ADMIN, "Show Player Panel", mo
|
||||
body += "<A href='byond://?_src_=holder;[HrefToken()];narrateto=[REF(player)]'>Narrate to</A> | "
|
||||
body += "<A href='byond://?_src_=holder;[HrefToken()];subtlemessage=[REF(player)]'>Subtle message</A> | "
|
||||
body += "<A href='byond://?_src_=holder;[HrefToken()];playsoundto=[REF(player)]'>Play sound to</A> | "
|
||||
body += "<A href='byond://?_src_=holder;[HrefToken()];languagemenu=[REF(player)]'>Language Menu</A>"
|
||||
body += "<A href='byond://?_src_=holder;[HrefToken()];languagemenu=[REF(player)]'>Language Menu</A> | "
|
||||
body += "<A href='byond://?_src_=holder;[HrefToken()];rpreminder=[REF(player)]'>Roleplay Reminder</A>"
|
||||
|
||||
if(player.client)
|
||||
if(!isnewplayer(player))
|
||||
@@ -449,8 +450,9 @@ ADMIN_VERB(lag_switch_panel, R_ADMIN, "Show Lag Switches", "Display the controls
|
||||
user << browse(dat.Join(), "window=lag_switch_panel;size=420x480")
|
||||
|
||||
ADMIN_VERB(spawn_panel, R_SPAWN, "Spawn Panel", "Spawn Panel (TGUI).", ADMIN_CATEGORY_GAME)
|
||||
var/datum/spawnpanel/panel = get_spawnpanel_for_admin(user.mob)
|
||||
if(panel)
|
||||
panel.ui_interact(user.mob)
|
||||
var/datum/spawnpanel/panel = user.holder.spawn_panel
|
||||
if(!panel)
|
||||
panel = new()
|
||||
user.holder.spawn_panel = panel
|
||||
panel.ui_interact(user.mob)
|
||||
BLACKBOX_LOG_ADMIN_VERB("Spawn Panel")
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
ADMIN_VERB(toggle_game_debug, R_DEBUG, "Debug-Game", "Toggles game debugging.", ADMIN_CATEGORY_DEBUG)
|
||||
GLOB.Debug2 = !GLOB.Debug2
|
||||
var/message = "toggled debugging [(GLOB.Debug2 ? "ON" : "OFF")]"
|
||||
GLOB.debugging_enabled = !GLOB.debugging_enabled
|
||||
var/message = "toggled debugging [(GLOB.debugging_enabled ? "ON" : "OFF")]"
|
||||
message_admins("[key_name_admin(user)] [message].")
|
||||
log_admin("[key_name(user)] [message].")
|
||||
BLACKBOX_LOG_ADMIN_VERB("Toggle Debug Two")
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
ADMIN_VERB(upload_jukebox_music, R_SERVER, "Jukebox Upload Music", "Upload a valid .ogg file to be accessed via the jukebox.", ADMIN_CATEGORY_SERVER)
|
||||
var/file = input(user, "Select a .ogg file to upload to the jukebox.") as sound|null
|
||||
if(!file)
|
||||
return
|
||||
|
||||
// we could theorticly support other sound types but OGG is the better format from what I am aware and I am 100% sure its length is properly fetched.
|
||||
if(!IS_OGG_FILE(file))
|
||||
tgui_alert(user, "Invalid file type. Please select an OGG file.", "Loading error", list("Ok"))
|
||||
return
|
||||
|
||||
var/list/track_data = splittext(file, "+")
|
||||
if(track_data.len < 2)
|
||||
if(tgui_alert(user, "Your song currently does not have a beat in deciseconds added to its title, e.g: SS13+5.ogg. Continue?", "Confirmation", list("Yes", "No")) != "Yes")
|
||||
return
|
||||
if(track_data.len > 2)
|
||||
tgui_alert(user, "Titles should only have its title and beat in deciseconds, e.g: SS13+5.ogg", "Loading error", list("Ok"))
|
||||
return
|
||||
|
||||
|
||||
var/clean_name = SANITIZE_FILENAME("[file]")
|
||||
var/save_path = "[CONFIG_JUKEBOX_SOUNDS][clean_name]"
|
||||
|
||||
// Copy uploaded file to the server
|
||||
fcopy(file, save_path)
|
||||
|
||||
message_admins("[key_name_admin(user)] uploaded [clean_name] to the jukebox!")
|
||||
to_chat(user, span_notice("Successfully uploaded [clean_name]!"))
|
||||
|
||||
ADMIN_VERB(browse_jukebox_music, R_SERVER, "Jukebox Browse Music", "Browse music files for moderation.", ADMIN_CATEGORY_SERVER)
|
||||
var/list/files = flist(CONFIG_JUKEBOX_SOUNDS)
|
||||
// Filter out things that are not sound files, like the exclude
|
||||
for(var/thing in files)
|
||||
if(!IS_SOUND_FILE(thing))
|
||||
files -= thing
|
||||
if(!files.len)
|
||||
to_chat(user, span_warning("No uploaded tracks found."))
|
||||
return
|
||||
|
||||
var/choice = tgui_input_list(user, "Select a track:", "Select Jukebox Music", files)
|
||||
if(!choice)
|
||||
return
|
||||
|
||||
var/path = "[CONFIG_JUKEBOX_SOUNDS][choice]"
|
||||
|
||||
switch(tgui_alert(user, "Play, Delete, or Download?", choice, list("Play", "Delete", "Download")))
|
||||
if ("Play")
|
||||
SEND_SOUND(user, sound(path))
|
||||
if ("Delete")
|
||||
fdel(path)
|
||||
var/msg = "[key_name_admin(user)] deleted [choice] from the jukebox!"
|
||||
message_admins(msg)
|
||||
log_admin(msg)
|
||||
SSblackbox.record_feedback("associative", "jukebox_deletion", 1, list("round_id" = "[GLOB.round_id]", "deletor" = "[key_name_admin(user)]", "deleted" = "[choice]"))
|
||||
if ("Download")
|
||||
user << ftp(file(path))
|
||||
else
|
||||
return
|
||||
@@ -554,7 +554,7 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w
|
||||
SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Mass Braindamage"))
|
||||
for(var/mob/living/carbon/human/human_mob in GLOB.player_list)
|
||||
to_chat(human_mob, span_bolddanger("You suddenly feel stupid."), confidential = TRUE)
|
||||
human_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 60, 80)
|
||||
human_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 60, 80)
|
||||
message_admins("[key_name_admin(holder)] made everybody brain damaged")
|
||||
if("floorlava")
|
||||
SSweather.run_weather(/datum/weather/floor_is_lava)
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
/datum/filter_editor/ui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "Filteriffic")
|
||||
ui = new(user, src, "Filterrific")
|
||||
ui.open()
|
||||
|
||||
/datum/filter_editor/ui_static_data(mob/user)
|
||||
@@ -21,7 +21,14 @@
|
||||
/datum/filter_editor/ui_data()
|
||||
var/list/data = list()
|
||||
data["target_name"] = target.name
|
||||
data["target_filter_data"] = target.filter_data
|
||||
var/list/target_filter_data = list()
|
||||
for (var/list/filter_info as anything in target.filter_data)
|
||||
filter_info = deep_copy_list(filter_info)
|
||||
if (filter_info["transform"])
|
||||
var/matrix/filter_transform = filter_info["transform"]
|
||||
filter_info["transform"] = list("a" = filter_transform.a, "b" = filter_transform.b, "c" = filter_transform.c, "d" = filter_transform.d, "e" = filter_transform.e, "f" = filter_transform.f)
|
||||
target_filter_data += list(filter_info)
|
||||
data["target_filter_data"] = target_filter_data
|
||||
return data
|
||||
|
||||
/datum/filter_editor/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
|
||||
@@ -68,6 +75,16 @@
|
||||
if(new_icon)
|
||||
target.modify_filter(params["name"], list("icon" = new_icon))
|
||||
. = TRUE
|
||||
if("modify_transform_value")
|
||||
var/list/filter_info = target.get_filter_data(params["name"])
|
||||
if (!filter_info)
|
||||
return
|
||||
var/matrix/new_transform = matrix(filter_info[params["field_name"]])
|
||||
if (!(params["transform_key"] in list("a", "b", "c", "d", "e", "f")))
|
||||
return
|
||||
new_transform.vars[params["transform_key"]] = text2num(params["transform_value"])
|
||||
target.modify_filter(params["name"], list(params["field_name"] = new_transform))
|
||||
. = TRUE
|
||||
if("mass_apply")
|
||||
if(!check_rights_for(usr.client, R_FUN))
|
||||
to_chat(usr, span_userdanger("Stay in your lane, jannie."))
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*
|
||||
* More than just a completely true statement, this datum is created as a tgui interface
|
||||
* allowing you to modify each vector until you know what you're doing.
|
||||
* Much like filteriffic, 'nobody wants to learn matrix math' is meant for developers like you and I
|
||||
* Much like filterrific, 'nobody wants to learn matrix math' is meant for developers like you and I
|
||||
* to implement interesting matrix transformations without the hassle if needing to know... algebra? Damn, i'm stupid.
|
||||
*/
|
||||
/datum/nobody_wants_to_learn_matrix_math
|
||||
|
||||
@@ -74,23 +74,23 @@
|
||||
var/newamt
|
||||
switch(Text)
|
||||
if("brute")
|
||||
L.adjustBruteLoss(amount, forced = TRUE)
|
||||
newamt = L.getBruteLoss()
|
||||
L.adjust_brute_loss(amount, forced = TRUE)
|
||||
newamt = L.get_brute_loss()
|
||||
if("fire")
|
||||
L.adjustFireLoss(amount, forced = TRUE)
|
||||
newamt = L.getFireLoss()
|
||||
L.adjust_fire_loss(amount, forced = TRUE)
|
||||
newamt = L.get_fire_loss()
|
||||
if("toxin")
|
||||
L.adjustToxLoss(amount, forced = TRUE)
|
||||
newamt = L.getToxLoss()
|
||||
L.adjust_tox_loss(amount, forced = TRUE)
|
||||
newamt = L.get_tox_loss()
|
||||
if("oxygen")
|
||||
L.adjustOxyLoss(amount, forced = TRUE)
|
||||
newamt = L.getOxyLoss()
|
||||
L.adjust_oxy_loss(amount, forced = TRUE)
|
||||
newamt = L.get_oxy_loss()
|
||||
if("brain")
|
||||
L.adjustOrganLoss(ORGAN_SLOT_BRAIN, amount)
|
||||
L.adjust_organ_loss(ORGAN_SLOT_BRAIN, amount)
|
||||
newamt = L.get_organ_loss(ORGAN_SLOT_BRAIN)
|
||||
if("stamina")
|
||||
L.adjustStaminaLoss(amount, forced = TRUE)
|
||||
newamt = L.getStaminaLoss()
|
||||
L.adjust_stamina_loss(amount, forced = TRUE)
|
||||
newamt = L.get_stamina_loss()
|
||||
else
|
||||
to_chat(usr, "You caused an error. DEBUG: Text:[Text] Mob:[L]", confidential = TRUE)
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user