mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-28 15:47:15 +01:00
Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-15-10-2025
This commit is contained in:
@@ -1,320 +1,93 @@
|
||||
/proc/reagentsforbeakers()
|
||||
. = list()
|
||||
for(var/t in subtypesof(/datum/reagent))
|
||||
var/datum/reagent/R = t
|
||||
. += list(list("id" = t, "text" = initial(R.name)))
|
||||
/datum/beaker_panel
|
||||
|
||||
. = json_encode(.)
|
||||
/datum/beaker_panel/ui_state(mob/user)
|
||||
return ADMIN_STATE(R_ADMIN)
|
||||
|
||||
/proc/beakersforbeakers()
|
||||
. = list()
|
||||
for(var/t in subtypesof(/obj/item/reagent_containers))
|
||||
var/obj/item/reagent_containers/C = t
|
||||
. += list(list("id" = t, "text" = initial(C.name), "volume" = initial(C.volume)))
|
||||
/datum/beaker_panel/ui_close()
|
||||
qdel(src)
|
||||
|
||||
. = json_encode(.)
|
||||
/datum/beaker_panel/ui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "BeakerPanel")
|
||||
ui.open()
|
||||
|
||||
/datum/admins/proc/beaker_panel_act(list/href_list)
|
||||
switch (href_list["beakerpanel"])
|
||||
if ("spawncontainer")
|
||||
var/containerdata = json_decode(href_list["container"])
|
||||
var/obj/item/reagent_containers/container = beaker_panel_create_container(containerdata, get_turf(usr))
|
||||
usr.log_message("spawned a [container] containing [pretty_string_from_reagent_list(container.reagents.reagent_list)]", LOG_GAME)
|
||||
if ("spawngrenade")
|
||||
var/obj/item/grenade/chem_grenade/grenade = new(get_turf(usr))
|
||||
var/containersdata = json_decode(href_list["containers"])
|
||||
var/reagent_string
|
||||
for (var/i in 1 to 2)
|
||||
grenade.beakers += beaker_panel_create_container(containersdata[i], grenade)
|
||||
reagent_string += " ([grenade.beakers[i].name] [i] : " + pretty_string_from_reagent_list(grenade.beakers[i].reagents.reagent_list) + ");"
|
||||
grenade.stage_change(GRENADE_READY)
|
||||
var/grenadedata = json_decode(href_list["grenadedata"])
|
||||
switch (href_list["grenadetype"])
|
||||
if ("normal") // Regular cable coil-timed grenade
|
||||
var/det_time = text2num(grenadedata["grenade-timer"])
|
||||
if (det_time)
|
||||
grenade.det_time = det_time
|
||||
usr.log_message("spawned a [grenade] containing: [reagent_string]", LOG_GAME)
|
||||
/datum/beaker_panel/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
|
||||
/datum/admins/proc/beaker_panel_prep_assembly(obj/item/assembly/towrap, grenade)
|
||||
var/obj/item/assembly/igniter/igniter = new
|
||||
igniter.secured = FALSE
|
||||
var/obj/item/assembly_holder/assholder = new(grenade)
|
||||
towrap.forceMove(assholder)
|
||||
igniter.forceMove(assholder)
|
||||
assholder.assemble(igniter, towrap, usr)
|
||||
assholder.master = grenade
|
||||
return assholder
|
||||
var/mob/user = ui.user
|
||||
switch(action)
|
||||
if("spawn")
|
||||
var/obj/created = spawn_container_from_data(user, params["spawn_info"])
|
||||
user.log_message("spawned a [created] containing [pretty_string_from_reagent_list(created.reagents.reagent_list)]", LOG_ADMIN)
|
||||
return TRUE
|
||||
if("spawngrenade")
|
||||
var/obj/item/grenade/chem_grenade/grenade = spawn_grenade_from_data(user, params["spawn_info"], params["grenade_info"])
|
||||
var/log_string = list()
|
||||
for(var/obj/beaker as anything in grenade.beakers)
|
||||
log_string += pretty_string_from_reagent_list(beaker.reagents.reagent_list)
|
||||
user.log_message("spawned a [grenade] containing [english_list(log_string)]", LOG_ADMIN)
|
||||
return TRUE
|
||||
|
||||
/datum/admins/proc/beaker_panel_create_container(list/containerdata, location)
|
||||
var/containertype = text2path(containerdata["container"])
|
||||
var/obj/item/reagent_containers/container = new containertype(location)
|
||||
var/datum/reagents/reagents = container.reagents
|
||||
for(var/datum/reagent/R in reagents.reagent_list) // clear the container of reagents
|
||||
reagents.remove_reagent(R.type,R.volume)
|
||||
for (var/list/item in containerdata["reagents"])
|
||||
var/datum/reagent/reagenttype = text2path(item["reagent"])
|
||||
var/amount = text2num(item["volume"])
|
||||
if ((reagents.total_volume + amount) > reagents.maximum_volume)
|
||||
reagents.maximum_volume = reagents.total_volume + amount
|
||||
reagents.add_reagent(reagenttype, amount)
|
||||
/datum/beaker_panel/ui_static_data(mob/user)
|
||||
var/list/data = list()
|
||||
|
||||
data["reagents"] = list()
|
||||
data["containers"] = list()
|
||||
|
||||
for(var/datum/reagent/reagent_type as anything in subtypesof(/datum/reagent))
|
||||
if(!reagent_type::name)
|
||||
continue
|
||||
data["reagents"] += list(list("id" = reagent_type, "text" = reagent_type::name))
|
||||
|
||||
for(var/obj/item/reagent_containers/container_type as anything in subtypesof(/obj/item/reagent_containers))
|
||||
if(!container_type::name)
|
||||
continue
|
||||
data["containers"] += list(list("id" = container_type, "text" = container_type::name, "volume" = container_type::volume))
|
||||
|
||||
return data
|
||||
|
||||
/datum/beaker_panel/proc/spawn_container_from_data(mob/user, list/spawn_info)
|
||||
var/container_type = text2path(spawn_info["container"])
|
||||
var/list/container_reagents = list()
|
||||
for(var/reagent_string, reagent_amount in spawn_info["reagents"])
|
||||
container_reagents[text2path(reagent_string)] = text2num(reagent_amount)
|
||||
|
||||
return spawn_container(user, container_type, container_reagents)
|
||||
|
||||
/datum/beaker_panel/proc/spawn_container(mob/user, container_type, list/container_reagents)
|
||||
var/obj/item/reagent_containers/container = new container_type(user.drop_location())
|
||||
container.reagents.maximum_volume = INFINITY
|
||||
container.reagents.clear_reagents()
|
||||
container.reagents.add_reagent_list(container_reagents)
|
||||
container.reagents.maximum_volume = max(container.reagents.total_volume, initial(container.volume))
|
||||
return container
|
||||
|
||||
/datum/beaker_panel/proc/spawn_grenade_from_data(mob/user, list/all_spawn_info, list/grenade_info)
|
||||
var/list/containers = list()
|
||||
for(var/list/container_info as anything in all_spawn_info)
|
||||
containers += spawn_container_from_data(user, container_info)
|
||||
|
||||
return spawn_grenade(user, containers, grenade_info)
|
||||
|
||||
/datum/beaker_panel/proc/spawn_grenade(mob/user, list/beakers, list/grenade_info)
|
||||
var/obj/item/grenade/chem_grenade/grenade = new(user.drop_location())
|
||||
grenade.beakers = beakers
|
||||
grenade.stage_change(GRENADE_READY)
|
||||
|
||||
for(var/obj/beaker as anything in grenade.beakers)
|
||||
beaker.forceMove(grenade)
|
||||
|
||||
switch(grenade_info["detonation_type"])
|
||||
if("normal")
|
||||
var/det_time = text2num(grenade_info["detonation_timer"]) * 1 SECONDS
|
||||
if(det_time)
|
||||
grenade.det_time = det_time
|
||||
|
||||
return grenade
|
||||
|
||||
ADMIN_VERB(beaker_panel, R_SPAWN, "Spawn Reagent Container", "Spawn a reagent container.", ADMIN_CATEGORY_EVENTS)
|
||||
var/datum/asset/asset_datum = get_asset_datum(/datum/asset/simple/namespaced/common)
|
||||
asset_datum.send(user)
|
||||
//Could somebody tell me why this isn't using the browser datum, given that it copypastes all of browser datum's html
|
||||
// fuck if I know, but im not touching it
|
||||
var/dat = {"
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
|
||||
<meta http-equiv='X-UA-Compatible' content='IE=edge'>
|
||||
<link rel='stylesheet' type='text/css' href='[SSassets.transport.get_asset_url("common.css")]'>
|
||||
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js"></script>
|
||||
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.7/js/select2.full.min.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.7/css/select2.min.css">
|
||||
<script type="text/javascript" src="https://kit.fontawesome.com/8d67455b41.js"></script>
|
||||
<style>
|
||||
.select2-search { color: #40628a; background-color: #272727; }
|
||||
.select2-results { color: #40628a; background-color: #272727; }
|
||||
.select2-selection { border-radius: 0px !important; }
|
||||
|
||||
ul {
|
||||
list-style-type: none; /* Remove bullets */
|
||||
padding: 0; /* Remove padding */
|
||||
margin: 0; /* Remove margins */
|
||||
}
|
||||
|
||||
ul li {
|
||||
margin-top: -1px; /* Prevent double borders */
|
||||
padding: 12px; /* Add some padding */
|
||||
color: #ffffff;
|
||||
text-decoration: none;
|
||||
background: #40628a;
|
||||
border: 1px solid #161616;
|
||||
margin: 0 2px 0 0;
|
||||
cursor:default;
|
||||
}
|
||||
|
||||
.remove-reagent {
|
||||
background-color: #d03000;
|
||||
}
|
||||
|
||||
.container-control {
|
||||
width: 48%;
|
||||
float: left;
|
||||
padding-right: 10px;
|
||||
}
|
||||
.reagent > div, .reagent-div {
|
||||
float: right;
|
||||
width: 200px;
|
||||
}
|
||||
input.reagent {
|
||||
width: 50%;
|
||||
}
|
||||
.grenade-data {
|
||||
display: inline-block;
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
window.onload=function(){
|
||||
|
||||
var reagents = [reagentsforbeakers()];
|
||||
|
||||
var containers = [beakersforbeakers()];
|
||||
|
||||
$('select\[name="containertype"\]').select2({
|
||||
data: containers,
|
||||
escapeMarkup: noEscape,
|
||||
templateResult: formatContainer,
|
||||
templateSelection: textSelection,
|
||||
width: "300px"
|
||||
});
|
||||
$('.select-new-reagent').select2({
|
||||
data: reagents,
|
||||
escapeMarkup: noEscape,
|
||||
templateResult: formatReagent,
|
||||
templateSelection: textSelection
|
||||
});
|
||||
|
||||
$('.remove-reagent').click(function() { $(this).parents('li').remove(); });
|
||||
|
||||
$('#spawn-grenade').click(function() {
|
||||
var containers = $('div.container-control').map(function() {
|
||||
var type = $(this).children('select\[name=containertype\]').select2("data")\[0\].id;
|
||||
var reagents = $(this).find("li.reagent").map(function() {
|
||||
return { "reagent": $(this).data("type"), "volume": $(this).find('input').val()};
|
||||
}).get();
|
||||
return {"container": type, "reagents": reagents };
|
||||
}).get();
|
||||
var grenadeType = $('#grenade-type').val()
|
||||
var grenadeData = {};
|
||||
$('.grenade-data.'+grenadeType).find(':input').each(function() {
|
||||
var ret = {};
|
||||
grenadeData\[$(this).attr('name')\] = $(this).val();
|
||||
});
|
||||
$.ajax({
|
||||
url: '',
|
||||
data: {
|
||||
"_src_": "holder",
|
||||
"admin_token": "[RawHrefToken()]",
|
||||
"beakerpanel": "spawngrenade",
|
||||
"containers": JSON.stringify(containers),
|
||||
"grenadetype": grenadeType,
|
||||
"grenadedata": JSON.stringify(grenadeData)
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$('.spawn-container').click(function() {
|
||||
var container = $(this).parents('div.container-control')\[0\];
|
||||
var type = $(container).children('select\[name=containertype\]').select2("data")\[0\].id;
|
||||
var reagents = $(container).find("li.reagent").map(function() {
|
||||
return { "reagent": $(this).data("type"), "volume": $(this).find('input').val()};
|
||||
}).get();
|
||||
$.ajax({
|
||||
url: '',
|
||||
data: {
|
||||
"_src_": "holder",
|
||||
"admin_token": "[RawHrefToken()]",
|
||||
"beakerpanel": "spawncontainer",
|
||||
"container": JSON.stringify({"container": type, "reagents": reagents }),
|
||||
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$('.add-reagent').click(function() {
|
||||
var select = $(this).parents('li').children('select').select2("data")\[0\];
|
||||
var amount = $(this).parent().children('input').val();
|
||||
addReagent($(this).parents('ul'), select.id, select.text, amount)
|
||||
})
|
||||
|
||||
$('.export-reagents').click(function() {
|
||||
var container = $(this).parents('div.container-control')\[0\];
|
||||
var ret = \[\];
|
||||
var reagents = $(container).find("li.reagent").each(function() {
|
||||
var reagentname = $(this).contents().filter(function(){ return this.nodeType == 3; })\[0\].nodeValue.toLowerCase().replace(/\\W/g, '');
|
||||
ret.push(reagentname+"="+$(this).find('input').val());
|
||||
});
|
||||
prompt("Copy this value", ret.join(';'));
|
||||
|
||||
});
|
||||
|
||||
$('.import-reagents').click(function() {
|
||||
var macro = prompt("Enter a chemistry macro", "");
|
||||
var parts = macro.split(';');
|
||||
var container = $(this).parents('div.container-control')\[0\];
|
||||
var ul = $(container).find("ul");
|
||||
|
||||
$(parts).each(function() {
|
||||
var reagentArr = this.split('=');
|
||||
var thisReagent = $(reagents).filter(function() { return this.text.toLowerCase().replace(/\\W/g, '') == reagentArr\[0\] })\[0\];
|
||||
addReagent(ul, thisReagent.id, thisReagent.text, reagentArr\[1\]);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
$('#grenade-type').change(function() {
|
||||
$('.grenade-data').hide();
|
||||
$('.grenade-data.'+$(this).val()).show();
|
||||
})
|
||||
|
||||
function addReagent(ul, reagentType, reagentName, amount)
|
||||
{
|
||||
$('<li class="reagent" data-type="'+reagentType+'">'+reagentName+'<div><input class="reagent" value="'+amount+'" /> <button class="remove-reagent"><i class="far fa-trash-alt"></i> Remove</button></div></li>').insertBefore($(ul).children('li').last());
|
||||
$(ul).children('li').last().prev().find('button').click(function() { $(this).parents('li').remove(); });
|
||||
}
|
||||
|
||||
function textSelection(selection)
|
||||
{
|
||||
return selection.text;
|
||||
}
|
||||
|
||||
function noEscape(markup)
|
||||
{
|
||||
return markup;
|
||||
}
|
||||
|
||||
function formatReagent(result)
|
||||
{
|
||||
return '<span>'+result.text+'</span><br/><span><small>'+result.id+'</small></span>';
|
||||
}
|
||||
|
||||
function formatContainer(result)
|
||||
{
|
||||
return '<span>'+result.text+" ("+result.volume+'u)</span><br/><span><small>'+result.id+'</small></span>';
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body scroll=auto>
|
||||
<div class='uiWrapper'>
|
||||
<div class='uiTitleWrapper'><div class='uiTitle'><tt>Beaker panel</tt></div></div>
|
||||
<div class='uiContent'>
|
||||
|
||||
<div class="width: 100%">
|
||||
<button id="spawn-grenade">
|
||||
<i class="fas fa-bomb"></i> Spawn grenade
|
||||
</button>
|
||||
<label for="grenade-type">Grenade type: </label>
|
||||
<select id="grenade-type">
|
||||
<option value="normal">Normal</option>
|
||||
</select>
|
||||
<div class="grenade-data normal">
|
||||
</div>
|
||||
<br />
|
||||
<small>note: beakers recommended, other containers may have issues</small>
|
||||
</div>
|
||||
|
||||
"}
|
||||
for (var/i in 1 to 2 )
|
||||
dat += {"
|
||||
<div class="container-control">
|
||||
<h4>
|
||||
Container [i]:
|
||||
</h4>
|
||||
<br />
|
||||
<label for="beaker[i]type">Container type</label>
|
||||
<select name="containertype" id="beaker[i]type"></select>
|
||||
<br />
|
||||
<br />
|
||||
<div>
|
||||
<button class="spawn-container">
|
||||
<i class="fas fa-cog"></i> Spawn
|
||||
</button>
|
||||
|
||||
<button class="import-reagents">
|
||||
<i class="fas fa-file-import"></i> Import
|
||||
</button>
|
||||
|
||||
<button class="export-reagents">
|
||||
<i class="fas fa-file-export"></i> Export
|
||||
</button>
|
||||
|
||||
</div>
|
||||
<ul>
|
||||
<li>
|
||||
|
||||
<select class="select-new-reagent"></select><div class="reagent-div"><input style="width: 50%" type="text" name="newreagent" value="40" /> <button class="add-reagent">
|
||||
<i class="fas fa-plus"></i> Add
|
||||
</button>
|
||||
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
"}
|
||||
|
||||
dat += {"
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
"}
|
||||
|
||||
user << browse(dat, "window=beakerpanel;size=1100x720")
|
||||
var/datum/beaker_panel/panel = new
|
||||
panel.ui_interact(user.mob)
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
if(!islist(victim_hiddenprints))
|
||||
victim_hiddenprints = list()
|
||||
|
||||
var/list/hiddenprints = flatten_list(victim_hiddenprints)
|
||||
var/list/hiddenprints = assoc_to_values(victim_hiddenprints)
|
||||
list_clear_nulls(hiddenprints)
|
||||
|
||||
if(!length(hiddenprints))
|
||||
|
||||
@@ -20,7 +20,7 @@ ADMIN_VERB(play_sound, R_SOUND, "Play Global Sound", "Play a sound to all connec
|
||||
admin_sound.status = SOUND_STREAM
|
||||
admin_sound.volume = vol
|
||||
|
||||
var/res = tgui_alert(user, "Show the title of this song to the players?",, list("Yes","No", "Cancel"))
|
||||
var/res = tgui_alert(user, "Show the title of this song to the players?", "Play Sound", list("Yes", "No", "Cancel"))
|
||||
switch(res)
|
||||
if("Yes")
|
||||
to_chat(world, span_boldannounce("An admin played: [sound]"), confidential = TRUE)
|
||||
@@ -104,34 +104,44 @@ GLOBAL_VAR_INIT(web_sound_cooldown, 0)
|
||||
music_extra_data["album"] = data["album"]
|
||||
duration = data["duration"] * 1 SECONDS
|
||||
if (duration > 10 MINUTES)
|
||||
if((tgui_alert(user, "This song is over 10 minutes long. Are you sure you want to play it?", "Length Warning!", list("No", "Yes", "Cancel")) != "Yes"))
|
||||
if((tgui_alert(user, "This song is over 10 minutes long. Are you sure you want to play it?", "Length Warning", list("No", "Yes", "Cancel")) != "Yes"))
|
||||
return
|
||||
var/res = tgui_alert(user, "Show the title of and link to this song to the players?\n[title]", "Show Info?", list("Yes", "No", "Cancel"))
|
||||
switch(res)
|
||||
var/include_song_data = tgui_alert(user, "Show the title of and link to this song to the players?\n[title]", "Song Info", list("Yes", "No", "Cancel"))
|
||||
switch(include_song_data)
|
||||
if("Yes")
|
||||
music_extra_data["title"] = data["title"]
|
||||
music_extra_data["artist"] = data["artist"]
|
||||
if("No")
|
||||
music_extra_data["link"] = "Song Link Hidden"
|
||||
music_extra_data["title"] = "Song Title Hidden"
|
||||
music_extra_data["artist"] = "Song Artist Hidden"
|
||||
music_extra_data["upload_date"] = "Song Upload Date Hidden"
|
||||
music_extra_data["album"] = "Song Album Hidden"
|
||||
music_extra_data["link"] = "\[\[HYPERLINK BLOCKED\]\]"
|
||||
music_extra_data["title"] = "Untitled"
|
||||
music_extra_data["artist"] = "Unknown"
|
||||
music_extra_data["upload_date"] = "XX.YY.ZZZZ"
|
||||
music_extra_data["album"] = "Default"
|
||||
if("Cancel", null)
|
||||
return
|
||||
var/anon = tgui_alert(user, "Display who played the song?", "Credit Yourself?", list("Yes", "No", "Cancel"))
|
||||
switch(anon)
|
||||
if("Yes")
|
||||
if(res == "Yes")
|
||||
to_chat(world, span_boldannounce("[user.key] played: [webpage_url]"), confidential = TRUE)
|
||||
var/stay_anonimous = tgui_alert(user, "Display who played the song?", "Credit Yourself", list("Yes", "No", "Cancel"))
|
||||
|
||||
var/list/to_chat_message = list()
|
||||
|
||||
switch(stay_anonimous)
|
||||
if("No")
|
||||
if(include_song_data == "Yes")
|
||||
to_chat_message += span_notice("[user.ckey] played: [span_linkify(webpage_url)]")
|
||||
else
|
||||
to_chat(world, span_boldannounce("[user.key] played a sound"), confidential = TRUE)
|
||||
if("No")
|
||||
if(res == "Yes")
|
||||
to_chat(world, span_boldannounce("An admin played: [webpage_url]"), confidential = TRUE)
|
||||
to_chat_message += span_notice("[user.ckey] played a sound.")
|
||||
if("Yes")
|
||||
if(include_song_data == "Yes")
|
||||
to_chat_message += span_notice("An admin played: [span_linkify(webpage_url)]")
|
||||
else
|
||||
to_chat_message += span_notice("An admin played a sound.")
|
||||
if("Cancel", null)
|
||||
return
|
||||
|
||||
if(credit)
|
||||
to_chat(world, span_boldannounce(credit), confidential = TRUE)
|
||||
to_chat_message += span_notice("<br>[credit]")
|
||||
|
||||
to_chat(world, fieldset_block("Now Playing: [span_bold(music_extra_data["title"])] by [span_bold(music_extra_data["artist"])]", jointext(to_chat_message, ""), "boxed_message"))
|
||||
|
||||
SSblackbox.record_feedback("nested tally", "played_url", 1, list("[user.ckey]", "[input]"))
|
||||
log_admin("[key_name(user)] played web sound: [input]")
|
||||
message_admins("[key_name(user)] played web sound: [input]")
|
||||
|
||||
@@ -2,32 +2,28 @@
|
||||
set category = "OOC"
|
||||
set name = "Request Internet Sound"
|
||||
|
||||
if(GLOB.say_disabled) //This is here to try to identify lag problems
|
||||
to_chat(usr, span_danger("Speech is currently admin-disabled."), confidential = TRUE)
|
||||
return
|
||||
|
||||
if (!CONFIG_GET(flag/request_internet_sound))
|
||||
if(!CONFIG_GET(flag/request_internet_sound))
|
||||
to_chat(usr, span_danger("This server has disabled internet sound requests."), confidential = TRUE)
|
||||
return
|
||||
|
||||
var/request_url = tgui_input_text(usr, "Please Input a URL", "Only certain sites are allowed, such as YouTube, SoundCloud, and Bandcamp.", "")
|
||||
var/request_url = tgui_input_text(usr, "Please input a URL. Supported sources: [replacetext(replacetext(CONFIG_GET(string/request_internet_allowed), "\\", ""), ",", ", ")].", "Request Intenet sound")
|
||||
if(!request_url)
|
||||
return
|
||||
|
||||
//regex filter
|
||||
var/regex/allowed_regex = regex(replacetext(CONFIG_GET(string/request_internet_allowed), ",", "|"), "i")
|
||||
if(!allowed_regex.Find(request_url))
|
||||
to_chat(usr, span_danger("Invalid URL. Please use a URL from one of the following sites: [replacetext(CONFIG_GET(string/request_internet_allowed), "\\", "")]"), confidential = TRUE)
|
||||
to_chat(usr, span_danger("Invalid URL. Please use a URL from one of the following sites: [replacetext(CONFIG_GET(string/request_internet_allowed), "\\", " ")]"), confidential = TRUE)
|
||||
return
|
||||
|
||||
var/credit = tgui_alert(usr, "Credit yourself for requesting this song? (will show up as [usr.ckey])", "Credit Yourself?", list("No", "Yes", "Cancel"))
|
||||
|
||||
if(credit == "Cancel" || isnull(credit))
|
||||
return
|
||||
|
||||
else if (credit == "Yes")
|
||||
credit = "[usr.ckey] requested this track."
|
||||
else
|
||||
credit = "Someone requested this track."
|
||||
credit = null
|
||||
|
||||
log_internet_request("[src.key]/([src.name]): [request_url]")
|
||||
if(usr.client)
|
||||
@@ -38,10 +34,14 @@
|
||||
return
|
||||
|
||||
GLOB.requests.music_request(usr.client, request_url, credit)
|
||||
to_chat(usr, span_info("You requested: \"[request_url]\" to be played."), confidential = TRUE)
|
||||
request_url = span_adminnotice("<b><font color='cyan'>MUSIC REQUEST: </font>[ADMIN_FULLMONTY(src)] [ADMIN_SC(src)]:</b> [span_linkify(request_url)] [ADMIN_PLAY_INTERNET(request_url, credit)]")
|
||||
to_chat(usr, span_info("You requested [span_linkify(request_url)] to be played."), confidential = TRUE)
|
||||
|
||||
var/list/admin_message = list()
|
||||
admin_message += ("[ADMIN_FULLMONTY(src)] [ADMIN_SC(src)] has requested the following to be played:<br>")
|
||||
admin_message += ("[span_linkify(request_url)] [ADMIN_PLAY_INTERNET(request_url, credit)]")
|
||||
|
||||
for(var/client/admin_client in GLOB.admins)
|
||||
if(get_chat_toggles(admin_client) & CHAT_PRAYER)
|
||||
to_chat(admin_client, request_url, type = MESSAGE_TYPE_PRAYER, confidential = TRUE)
|
||||
to_chat(admin_client, fieldset_block("Internet sound requested", jointext(admin_message, ""), "boxed_message"), type = MESSAGE_TYPE_PRAYER, confidential = TRUE)
|
||||
|
||||
SSblackbox.record_feedback("tally", "music_request", 1, "Music Request") // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc!
|
||||
|
||||
@@ -231,9 +231,8 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w
|
||||
log_admin("[key_name(holder)] turned all humans into [result]")
|
||||
message_admins("\blue [key_name_admin(holder)] turned all humans into [result]")
|
||||
var/newtype = GLOB.species_list[result]
|
||||
for(var/i in GLOB.human_list)
|
||||
var/mob/living/carbon/human/H = i
|
||||
H.set_species(newtype)
|
||||
for(var/mob/living/carbon/human/human_mob as anything in GLOB.human_list)
|
||||
human_mob.set_species(newtype)
|
||||
if("power")
|
||||
if(!is_funmin)
|
||||
return
|
||||
@@ -518,9 +517,8 @@ 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("Monkeyize All Humans"))
|
||||
message_admins("[key_name_admin(holder)] made everyone into monkeys.")
|
||||
log_admin("[key_name_admin(holder)] made everyone into monkeys.")
|
||||
for(var/i in GLOB.human_list)
|
||||
var/mob/living/carbon/human/H = i
|
||||
INVOKE_ASYNC(H, TYPE_PROC_REF(/mob/living/carbon, monkeyize))
|
||||
for(var/mob/living/carbon/human/human_mob as anything in GLOB.human_list)
|
||||
INVOKE_ASYNC(human_mob, TYPE_PROC_REF(/mob/living/carbon, monkeyize))
|
||||
if("antag_all")
|
||||
if(!is_funmin)
|
||||
return
|
||||
@@ -554,9 +552,9 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w
|
||||
if(!is_funmin)
|
||||
return
|
||||
SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Mass Braindamage"))
|
||||
for(var/mob/living/carbon/human/H in GLOB.player_list)
|
||||
to_chat(H, span_bolddanger("You suddenly feel stupid."), confidential = TRUE)
|
||||
H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 60, 80)
|
||||
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)
|
||||
message_admins("[key_name_admin(holder)] made everybody brain damaged")
|
||||
if("floorlava")
|
||||
SSweather.run_weather(/datum/weather/floor_is_lava)
|
||||
@@ -573,33 +571,32 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w
|
||||
return
|
||||
SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Chinese Cartoons"))
|
||||
message_admins("[key_name_admin(holder)] made everything kawaii.")
|
||||
for(var/i in GLOB.human_list)
|
||||
var/mob/living/carbon/human/H = i
|
||||
SEND_SOUND(H, sound(SSstation.announcer.event_sounds[ANNOUNCER_ANIMES]))
|
||||
for(var/mob/living/carbon/human/human_mob as anything in GLOB.human_list)
|
||||
SEND_SOUND(human_mob, sound(SSstation.announcer.event_sounds[ANNOUNCER_ANIMES]))
|
||||
|
||||
if(H.dna.species.id == SPECIES_HUMAN)
|
||||
if(H.dna.features[FEATURE_TAIL] == "None" || H.dna.features[FEATURE_EARS] == "None")
|
||||
if(human_mob.dna.species.id == SPECIES_HUMAN)
|
||||
if(human_mob.dna.features[FEATURE_TAIL_CAT] == "None" || human_mob.dna.features[FEATURE_EARS] == "None")
|
||||
var/obj/item/organ/ears/cat/ears = new
|
||||
var/obj/item/organ/tail/cat/tail = new
|
||||
ears.Insert(H, movement_flags = DELETE_IF_REPLACED)
|
||||
tail.Insert(H, movement_flags = DELETE_IF_REPLACED)
|
||||
ears.Insert(human_mob, movement_flags = DELETE_IF_REPLACED)
|
||||
tail.Insert(human_mob, movement_flags = DELETE_IF_REPLACED)
|
||||
var/list/honorifics = list("[MALE]" = list("kun"), "[FEMALE]" = list("chan","tan"), "[NEUTER]" = list("san"), "[PLURAL]" = list("san")) //John Robust -> Robust-kun
|
||||
var/list/names = splittext(H.real_name," ")
|
||||
var/list/names = splittext(human_mob.real_name," ")
|
||||
var/forename = names.len > 1 ? names[2] : names[1]
|
||||
var/newname = "[forename]-[pick(honorifics["[H.gender]"])]"
|
||||
H.fully_replace_character_name(H.real_name,newname)
|
||||
H.update_body_parts()
|
||||
var/newname = "[forename]-[pick(honorifics["[human_mob.gender]"])]"
|
||||
human_mob.fully_replace_character_name(human_mob.real_name,newname)
|
||||
human_mob.update_body_parts()
|
||||
if(animetype == "Yes")
|
||||
var/seifuku = pick(typesof(/obj/item/clothing/under/costume/seifuku))
|
||||
var/obj/item/clothing/under/costume/seifuku/I = new seifuku
|
||||
var/olduniform = H.w_uniform
|
||||
H.temporarilyRemoveItemFromInventory(H.w_uniform, TRUE, FALSE)
|
||||
H.equip_to_slot_or_del(I, ITEM_SLOT_ICLOTHING)
|
||||
var/obj/item/clothing/under/costume/seifuku/anime_uniform = new seifuku
|
||||
var/olduniform = human_mob.w_uniform
|
||||
human_mob.temporarilyRemoveItemFromInventory(human_mob.w_uniform, TRUE, FALSE)
|
||||
human_mob.equip_to_slot_or_del(anime_uniform, ITEM_SLOT_ICLOTHING)
|
||||
qdel(olduniform)
|
||||
if(droptype == "Yes")
|
||||
ADD_TRAIT(I, TRAIT_NODROP, ADMIN_TRAIT)
|
||||
ADD_TRAIT(anime_uniform, TRAIT_NODROP, ADMIN_TRAIT)
|
||||
else
|
||||
to_chat(H, span_warning("You're not kawaii enough for this!"), confidential = TRUE)
|
||||
to_chat(human_mob, span_warning("You're not kawaii enough for this!"), confidential = TRUE)
|
||||
if("masspurrbation")
|
||||
if(!is_funmin)
|
||||
return
|
||||
@@ -709,16 +706,16 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w
|
||||
/// portal_appearance is a list in the form (turf's plane offset + 1) -> appearance to use
|
||||
/proc/do_portal_spawn(turf/loc, mobtype, numtospawn, list/portal_appearance, players, humanoutfit)
|
||||
for (var/i in 1 to numtospawn)
|
||||
var/mob/spawnedMob = new mobtype(loc)
|
||||
var/mob/spawned_mob = new mobtype(loc)
|
||||
if (length(players))
|
||||
var/mob/chosen = players[1]
|
||||
if (chosen.client)
|
||||
chosen.client.prefs.safe_transfer_prefs_to(spawnedMob, is_antag = TRUE)
|
||||
spawnedMob.PossessByPlayer(chosen.key)
|
||||
chosen.client.prefs.safe_transfer_prefs_to(spawned_mob, is_antag = TRUE)
|
||||
spawned_mob.PossessByPlayer(chosen.key)
|
||||
players -= chosen
|
||||
if (ishuman(spawnedMob) && ispath(humanoutfit, /datum/outfit))
|
||||
var/mob/living/carbon/human/H = spawnedMob
|
||||
H.equipOutfit(humanoutfit)
|
||||
if (ishuman(spawned_mob) && ispath(humanoutfit, /datum/outfit))
|
||||
var/mob/living/carbon/human/human_mob = spawned_mob
|
||||
human_mob.equipOutfit(humanoutfit)
|
||||
var/turf/T = get_step(loc, SOUTHWEST)
|
||||
T.flick_overlay_static(portal_appearance[GET_TURF_PLANE_OFFSET(T) + 1], 15)
|
||||
playsound(T, 'sound/effects/magic/lightningbolt.ogg', rand(80, 100), TRUE)
|
||||
|
||||
@@ -107,7 +107,9 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(select_equipment, R_FUN, "Select Equipment", mob/ta
|
||||
|
||||
var/icon/dummysprite = get_flat_human_icon(null,
|
||||
dummy_key = dummy_key,
|
||||
outfit_override = selected_outfit)
|
||||
outfit_override = selected_outfit,
|
||||
no_anim = TRUE,
|
||||
)
|
||||
data["icon64"] = icon2base64(dummysprite)
|
||||
data["name"] = target_mob
|
||||
|
||||
|
||||
Reference in New Issue
Block a user