TG spawn panel port (#19293)

* TG spawn panel port

* .

* .

* click intercept

* .

* diagonals

* .

* .

* fix path search

* reduce that

* Fixes ghost click

* lol

---------

Co-authored-by: Cameron Lennox <killer65311@gmail.com>
This commit is contained in:
Kashargul
2026-03-30 01:01:27 +02:00
committed by GitHub
parent c38c0d0698
commit 7c7aa0d237
38 changed files with 2236 additions and 662 deletions
+200 -203
View File
@@ -49,12 +49,12 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(show_player_panel, R_HOLDER, "Show Player Panel", m
var/body = "Options panel for " + span_bold("[player]")
if(player.client)
body += " played by " + span_bold("[player.client]")
body += "\[<A href='byond://?_src_=holder;[HrefToken()];editrights=[(GLOB.admin_datums[player.client.ckey] || GLOB.deadmins[player.client.ckey]) ? "rank" : "add"];key=[player.key]'>[player.client.holder ? player.client.holder.rank_names() : "Player"]</A>\]"
body += "\[<a href='byond://?_src_=holder;[HrefToken()];editrights=[(GLOB.admin_datums[player.client.ckey] || GLOB.deadmins[player.client.ckey]) ? "rank" : "add"];key=[player.key]'>[player.client.holder ? player.client.holder.rank_names() : "Player"]</a>\]"
if(isnewplayer(player))
body += span_bold("Hasn't Entered Game")
else
body += " \[<A href='byond://?_src_=holder;[HrefToken()];revive=[REF(player)]'>Heal</A>\] "
body += " \[<a href='byond://?_src_=holder;[HrefToken()];revive=[REF(player)]'>Heal</a>\] "
if(player.client)
body += "<br>" + span_bold("First connection:") + "[player.client.player_age] days ago"
@@ -63,42 +63,42 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(show_player_panel, R_HOLDER, "Show Player Panel", m
body += {"
<br><br>\[
<a href='byond://?_src_=vars;[HrefToken()];Vars=\ref[player]'>VV</a> -
<a href='byond://?_src_=holder;[HrefToken()];traitor=\ref[player]'>TP</a> -
<a href='byond://??_src_=holder;[HrefToken()];priv_msg=\ref[player]'>PM</a> -
<a href='byond://?_src_=holder;[HrefToken()];subtlemessage=\ref[player]'>SM</a> -
<a href='byond://?_src_=vars;[HrefToken()];Vars=[REF(player)]'>VV</a> -
<a href='byond://?_src_=holder;[HrefToken()];traitor=[REF(player)]'>TP</a> -
<a href='byond://??_src_=holder;[HrefToken()];priv_msg=[REF(player)]'>PM</a> -
<a href='byond://?_src_=holder;[HrefToken()];subtlemessage=[REF(player)]'>SM</a> -
[admin_jump_link(player, src)]\] <br>
"} + span_bold("Mob type:") + {"[player.type]<br>
"} + span_bold("Inactivity time:") + {" [player.client ? "[player.client.inactivity/600] minutes" : "Logged out"]<br/><br/>
<A href='byond://?_src_=holder;[HrefToken()];boot2=\ref[player]'>Kick</A> |
<A href='byond://?_src_=holder;[HrefToken()];warn=[player.ckey]'>Warn</A> |
<A href='byond://?_src_=holder;[HrefToken()];newban=\ref[player]'>Ban</A> |
<A href='byond://?_src_=holder;[HrefToken()];jobban2=\ref[player]'>Jobban</A> |
<A href='byond://?_src_=holder;[HrefToken()];notes=show;mob=\ref[player]'>Notes</A>
<a href='byond://?_src_=holder;[HrefToken()];boot2=[REF(player)]'>Kick</a> |
<a href='byond://?_src_=holder;[HrefToken()];warn=[player.ckey]'>Warn</a> |
<a href='byond://?_src_=holder;[HrefToken()];newban=[REF(player)]'>Ban</a> |
<a href='byond://?_src_=holder;[HrefToken()];jobban2=[REF(player)]'>Jobban</a> |
<a href='byond://?_src_=holder;[HrefToken()];notes=show;mob=[REF(player)]'>Notes</a>
"}
if(player.client)
body += "| <A href='byond://?_src_=holder;[HrefToken()];sendtoprison=\ref[player]'>Prison</A> | "
body += "\ <A href='byond://?_src_=holder;[HrefToken()];sendbacktolobby=\ref[player]'>Send back to Lobby</A> | "
body += "| <a href='byond://?_src_=holder;[HrefToken()];sendtoprison=[REF(player)]'>Prison</a> | "
body += "\ <a href='byond://?_src_=holder;[HrefToken()];sendbacktolobby=[REF(player)]'>Send back to Lobby</a> | "
var/muted = player.client.prefs.muted
body += {"<br>"} + span_bold("Mute: ") + {"
\[<A href='byond://?_src_=holder;[HrefToken()];mute=\ref[player];mute_type=[MUTE_IC]'>[(muted & MUTE_IC) ? span_red("IC") : span_blue("IC")]</a> |
<A href='byond://?_src_=holder;[HrefToken()];mute=\ref[player];mute_type=[MUTE_OOC]'>[(muted & MUTE_OOC) ? span_red("OOC") : span_blue("OOC")]</a> |
<A href='byond://?_src_=holder;[HrefToken()];mute=\ref[player];mute_type=[MUTE_LOOC]'>[(muted & MUTE_LOOC) ? span_red("LOOC") : span_blue("LOOC")]</a> |
<A href='byond://?_src_=holder;[HrefToken()];mute=\ref[player];mute_type=[MUTE_PRAY]'>[(muted & MUTE_PRAY) ? span_red("PRAY") : span_blue("PRAY")]</a> |
<A href='byond://?_src_=holder;[HrefToken()];mute=\ref[player];mute_type=[MUTE_ADMINHELP]'>[(muted & MUTE_ADMINHELP) ? span_red("ADMINHELP") : span_blue("ADMINHELP")]</a> |
<A href='byond://?_src_=holder;[HrefToken()];mute=\ref[player];mute_type=[MUTE_DEADCHAT]'>[(muted & MUTE_DEADCHAT) ? span_red("DEADCHAT") : span_blue("DEADCHAT")]</a>\]
(<A href='byond://?_src_=holder;[HrefToken()];mute=\ref[player];mute_type=[MUTE_ALL]'>[(muted & MUTE_ALL) ? span_red("toggle all") : span_blue("toggle all")]</a>)
\[<a href='byond://?_src_=holder;[HrefToken()];mute=[REF(player)];mute_type=[MUTE_IC]'>[(muted & MUTE_IC) ? span_red("IC") : span_blue("IC")]</a> |
<a href='byond://?_src_=holder;[HrefToken()];mute=[REF(player)];mute_type=[MUTE_OOC]'>[(muted & MUTE_OOC) ? span_red("OOC") : span_blue("OOC")]</a> |
<a href='byond://?_src_=holder;[HrefToken()];mute=[REF(player)];mute_type=[MUTE_LOOC]'>[(muted & MUTE_LOOC) ? span_red("LOOC") : span_blue("LOOC")]</a> |
<a href='byond://?_src_=holder;[HrefToken()];mute=[REF(player)];mute_type=[MUTE_PRAY]'>[(muted & MUTE_PRAY) ? span_red("PRAY") : span_blue("PRAY")]</a> |
<a href='byond://?_src_=holder;[HrefToken()];mute=[REF(player)];mute_type=[MUTE_ADMINHELP]'>[(muted & MUTE_ADMINHELP) ? span_red("ADMINHELP") : span_blue("ADMINHELP")]</a> |
<a href='byond://?_src_=holder;[HrefToken()];mute=[REF(player)];mute_type=[MUTE_DEADCHAT]'>[(muted & MUTE_DEADCHAT) ? span_red("DEADCHAT") : span_blue("DEADCHAT")]</a>\]
(<a href='byond://?_src_=holder;[HrefToken()];mute=[REF(player)];mute_type=[MUTE_ALL]'>[(muted & MUTE_ALL) ? span_red("toggle all") : span_blue("toggle all")]</a>)
"}
body += {"<br><br>
<A href='byond://?_src_=holder;[HrefToken()];jumpto=\ref[player]'>"} + span_bold("Jump to") + {"</A> |
<A href='byond://?_src_=holder;[HrefToken()];getmob=\ref[player]'>Get</A> |
<A href='byond://?_src_=holder;[HrefToken()];sendmob=\ref[player]'>Send To</A>
<a href='byond://?_src_=holder;[HrefToken()];jumpto=[REF(player)]'>"} + span_bold("Jump to") + {"</a> |
<a href='byond://?_src_=holder;[HrefToken()];getmob=[REF(player)]'>Get</a> |
<a href='byond://?_src_=holder;[HrefToken()];sendmob=[REF(player)]'>Send To</a>
<br><br>
[check_rights(R_ADMIN|R_MOD|R_EVENT,0) ? "<A href='byond://?_src_=holder;[HrefToken()];traitor=\ref[player]'>Traitor panel</A> | " : "" ]
<A href='byond://?_src_=holder;[HrefToken()];narrateto=\ref[player]'>Narrate to</A> |
<A href='byond://?_src_=holder;[HrefToken()];subtlemessage=\ref[player]'>Subtle message</A>
[check_rights(R_ADMIN|R_MOD|R_EVENT,0) ? "<a href='byond://?_src_=holder;[HrefToken()];traitor=[REF(player)]'>Traitor panel</a> | " : "" ]
<a href='byond://?_src_=holder;[HrefToken()];narrateto=[REF(player)]'>Narrate to</a> |
<a href='byond://?_src_=holder;[HrefToken()];subtlemessage=[REF(player)]'>Subtle message</a>
"}
if (player.client)
@@ -111,30 +111,30 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(show_player_panel, R_HOLDER, "Show Player Panel", m
if(issmall(player))
body += span_bold("Monkeyized") + " | "
else
body += "<A href='byond://?_src_=holder;[HrefToken()];turn_monkey=\ref[player]'>Monkeyize</A> | "
body += "<a href='byond://?_src_=holder;[HrefToken()];turn_monkey=[REF(player)]'>Monkeyize</a> | "
//Corgi
if(iscorgi(player))
body += span_bold("Corgized") + " | "
else
body += "<A href='byond://?_src_=holder;[HrefToken()];corgione=\ref[player]'>Corgize</A> | "
body += "<a href='byond://?_src_=holder;[HrefToken()];corgione=[REF(player)]'>Corgize</a> | "
//AI / Cyborg
if(isAI(player))
body += span_bold("Is an AI ")
else if(ishuman(player))
body += {"<A href='byond://?_src_=holder;[HrefToken()];turn_ai=\ref[player]'>Make AI</A> |
<A href='byond://?_src_=holder;[HrefToken()];turn_robot=\ref[player]'>Make Robot</A> |
<A href='byond://?_src_=holder;[HrefToken()];turn_alien=\ref[player]'>Make Alien</A>
body += {"<a href='byond://?_src_=holder;[HrefToken()];turn_ai=[REF(player)]'>Make AI</a> |
<a href='byond://?_src_=holder;[HrefToken()];turn_robot=[REF(player)]'>Make Robot</a> |
<a href='byond://?_src_=holder;[HrefToken()];turn_alien=[REF(player)]'>Make Alien</a>
"}
//Simple Animals
if(isanimal(player))
body += "<A href='byond://?_src_=holder;[HrefToken()];makeanimal=\ref[player]'>Re-Animalize</A> | "
body += "<a href='byond://?_src_=holder;[HrefToken()];makeanimal=[REF(player)]'>Re-Animalize</a> | "
else
body += "<A href='byond://?_src_=holder;[HrefToken()];makeanimal=\ref[player]'>Animalize</A> | "
body += "<a href='byond://?_src_=holder;[HrefToken()];makeanimal=[REF(player)]'>Animalize</a> | "
body += "<A href='byond://?_src_=holder;[HrefToken()];respawn=\ref[player.client]'>Respawn</A> | "
body += "<a href='byond://?_src_=holder;[HrefToken()];respawn=[REF(player.client)]'>Respawn</a> | "
// DNA2 - Admin Hax
if(player.dna && iscarbon(player))
@@ -170,7 +170,7 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(show_player_panel, R_HOLDER, "Show Player Panel", m
bname = span_orange(bname)
else
bname = span_red(bname)
body += "<A href='byond://?_src_=holder;[HrefToken()];togmutate=\ref[player];block=[block]' title='[tname]'>[bname]</A><sub>[block]</sub>" // Traitgenes edit - show trait linked names on mouseover
body += "<a href='byond://?_src_=holder;[HrefToken()];togmutate=[REF(player)];block=[block]' title='[tname]'>[bname]</a><sub>[block]</sub>" // Traitgenes edit - show trait linked names on mouseover
else
body += "[block]"
body+="</td>"
@@ -178,45 +178,45 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(show_player_panel, R_HOLDER, "Show Player Panel", m
body += {"<br><br>
"} + span_bold("Rudimentary transformation:") + span_normal("<br>These transformations only create a new mob type and copy stuff over. They do not take into account MMIs and similar mob-specific things. The buttons in 'Transformations' are preferred, when possible.") + {"<br>
<A href='byond://?_src_=holder;[HrefToken()];simplemake=observer;mob=\ref[player]'>Observer</A> |
\[ Xenos: <A href='byond://?_src_=holder;[HrefToken()];simplemake=larva;mob=\ref[player]'>Larva</A>
<A href='byond://?_src_=holder;[HrefToken()];simplemake=human;species=Xenomorph Drone;mob=\ref[player]'>Drone</A>
<A href='byond://?_src_=holder;[HrefToken()];simplemake=human;species=Xenomorph Hunter;mob=\ref[player]'>Hunter</A>
<A href='byond://?_src_=holder;[HrefToken()];simplemake=human;species=Xenomorph Sentinel;mob=\ref[player]'>Sentinel</A>
<A href='byond://?_src_=holder;[HrefToken()];simplemake=human;species=Xenomorph Queen;mob=\ref[player]'>Queen</A> \] |
\[ Crew: <A href='byond://?_src_=holder;[HrefToken()];simplemake=human;mob=\ref[player]'>Human</A>
<A href='byond://?_src_=holder;[HrefToken()];simplemake=human;species=Unathi;mob=\ref[player]'>Unathi</A>
<A href='byond://?_src_=holder;[HrefToken()];simplemake=human;species=Tajaran;mob=\ref[player]'>Tajaran</A>
<A href='byond://?_src_=holder;[HrefToken()];simplemake=human;species=Skrell;mob=\ref[player]'>Skrell</A> \] | \[
<A href='byond://?_src_=holder;[HrefToken()];simplemake=nymph;mob=\ref[player]'>Nymph</A>
<A href='byond://?_src_=holder;[HrefToken()];simplemake=human;species='Diona';mob=\ref[player]'>Diona</A> \] |
\[ slime: <A href='byond://?_src_=holder;[HrefToken()];simplemake=slime;mob=\ref[player]'>Baby</A>,
<A href='byond://?_src_=holder;[HrefToken()];simplemake=adultslime;mob=\ref[player]'>Adult</A> \]
<A href='byond://?_src_=holder;[HrefToken()];simplemake=monkey;mob=\ref[player]'>Monkey</A> |
<A href='byond://?_src_=holder;[HrefToken()];simplemake=robot;mob=\ref[player]'>Cyborg</A> |
<A href='byond://?_src_=holder;[HrefToken()];simplemake=cat;mob=\ref[player]'>Cat</A> |
<A href='byond://?_src_=holder;[HrefToken()];simplemake=runtime;mob=\ref[player]'>Runtime</A> |
<A href='byond://?_src_=holder;[HrefToken()];simplemake=corgi;mob=\ref[player]'>Corgi</A> |
<A href='byond://?_src_=holder;[HrefToken()];simplemake=ian;mob=\ref[player]'>Ian</A> |
<A href='byond://?_src_=holder;[HrefToken()];simplemake=crab;mob=\ref[player]'>Crab</A> |
<A href='byond://?_src_=holder;[HrefToken()];simplemake=coffee;mob=\ref[player]'>Coffee</A> |
\[ Construct: <A href='byond://?_src_=holder;[HrefToken()];simplemake=constructarmoured;mob=\ref[player]'>Armoured</A> ,
<A href='byond://?_src_=holder;[HrefToken()];simplemake=constructbuilder;mob=\ref[player]'>Builder</A> ,
<A href='byond://?_src_=holder;[HrefToken()];simplemake=constructwraith;mob=\ref[player]'>Wraith</A> \]
<A href='byond://?_src_=holder;[HrefToken()];simplemake=shade;mob=\ref[player]'>Shade</A>
<a href='byond://?_src_=holder;[HrefToken()];simplemake=observer;mob=[REF(player)]'>Observer</a> |
\[ Xenos: <a href='byond://?_src_=holder;[HrefToken()];simplemake=larva;mob=[REF(player)]'>Larva</a>
<a href='byond://?_src_=holder;[HrefToken()];simplemake=human;species=Xenomorph Drone;mob=[REF(player)]'>Drone</a>
<a href='byond://?_src_=holder;[HrefToken()];simplemake=human;species=Xenomorph Hunter;mob=[REF(player)]'>Hunter</a>
<a href='byond://?_src_=holder;[HrefToken()];simplemake=human;species=Xenomorph Sentinel;mob=[REF(player)]'>Sentinel</a>
<a href='byond://?_src_=holder;[HrefToken()];simplemake=human;species=Xenomorph Queen;mob=[REF(player)]'>Queen</a> \] |
\[ Crew: <a href='byond://?_src_=holder;[HrefToken()];simplemake=human;mob=[REF(player)]'>Human</a>
<a href='byond://?_src_=holder;[HrefToken()];simplemake=human;species=Unathi;mob=[REF(player)]'>Unathi</a>
<a href='byond://?_src_=holder;[HrefToken()];simplemake=human;species=Tajaran;mob=[REF(player)]'>Tajaran</a>
<a href='byond://?_src_=holder;[HrefToken()];simplemake=human;species=Skrell;mob=[REF(player)]'>Skrell</a> \] | \[
<a href='byond://?_src_=holder;[HrefToken()];simplemake=nymph;mob=[REF(player)]'>Nymph</a>
<a href='byond://?_src_=holder;[HrefToken()];simplemake=human;species='Diona';mob=[REF(player)]'>Diona</a> \] |
\[ slime: <a href='byond://?_src_=holder;[HrefToken()];simplemake=slime;mob=[REF(player)]'>Baby</a>,
<a href='byond://?_src_=holder;[HrefToken()];simplemake=adultslime;mob=[REF(player)]'>Adult</a> \]
<a href='byond://?_src_=holder;[HrefToken()];simplemake=monkey;mob=[REF(player)]'>Monkey</a> |
<a href='byond://?_src_=holder;[HrefToken()];simplemake=robot;mob=[REF(player)]'>Cyborg</a> |
<a href='byond://?_src_=holder;[HrefToken()];simplemake=cat;mob=[REF(player)]'>Cat</a> |
<a href='byond://?_src_=holder;[HrefToken()];simplemake=runtime;mob=[REF(player)]'>Runtime</a> |
<a href='byond://?_src_=holder;[HrefToken()];simplemake=corgi;mob=[REF(player)]'>Corgi</a> |
<a href='byond://?_src_=holder;[HrefToken()];simplemake=ian;mob=[REF(player)]'>Ian</a> |
<a href='byond://?_src_=holder;[HrefToken()];simplemake=crab;mob=[REF(player)]'>Crab</a> |
<a href='byond://?_src_=holder;[HrefToken()];simplemake=coffee;mob=[REF(player)]'>Coffee</a> |
\[ Construct: <a href='byond://?_src_=holder;[HrefToken()];simplemake=constructarmoured;mob=[REF(player)]'>Armoured</a> ,
<a href='byond://?_src_=holder;[HrefToken()];simplemake=constructbuilder;mob=[REF(player)]'>Builder</a> ,
<a href='byond://?_src_=holder;[HrefToken()];simplemake=constructwraith;mob=[REF(player)]'>Wraith</a> \]
<a href='byond://?_src_=holder;[HrefToken()];simplemake=shade;mob=[REF(player)]'>Shade</a>
<br>
"}
body += {"<br><br>
"} + span_bold("Other actions:") + {"
<br>
<A href='byond://?_src_=holder;[HrefToken()];forcespeech=\ref[player]'>Forcesay</A>
<a href='byond://?_src_=holder;[HrefToken()];forcespeech=[REF(player)]'>Forcesay</a>
"}
if (player.client)
body += {" |
<A href='byond://?_src_=holder;[HrefToken()];tdome1=\ref[player]'>Thunderdome 1</A> |
<A href='byond://?_src_=holder;[HrefToken()];tdome2=\ref[player]'>Thunderdome 2</A> |
<A href='byond://?_src_=holder;[HrefToken()];tdomeadmin=\ref[player]'>Thunderdome Admin</A> |
<A href='byond://?_src_=holder;[HrefToken()];tdomeobserve=\ref[player]'>Thunderdome Observer</A> |
<a href='byond://?_src_=holder;[HrefToken()];tdome1=[REF(player)]'>Thunderdome 1</a> |
<a href='byond://?_src_=holder;[HrefToken()];tdome2=[REF(player)]'>Thunderdome 2</a> |
<a href='byond://?_src_=holder;[HrefToken()];tdomeadmin=[REF(player)]'>Thunderdome Admin</a> |
<a href='byond://?_src_=holder;[HrefToken()];tdomeobserve=[REF(player)]'>Thunderdome Observer</a> |
"}
// language toggles
body += "<br><br>" + span_bold("Languages:") + "<br>"
@@ -227,9 +227,9 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(show_player_panel, R_HOLDER, "Show Player Panel", m
if(!f) body += " | "
else f = 0
if(L in player.languages)
body += "<a href='byond://?_src_=holder;[HrefToken()];toglang=\ref[player];lang=[html_encode(k)]'>[span_green(k)]</a>"
body += "<a href='byond://?_src_=holder;[HrefToken()];toglang=[REF(player)];lang=[html_encode(k)]'>[span_green(k)]</a>"
else
body += "<a href='byond://?_src_=holder;[HrefToken()];toglang=\ref[player];lang=[html_encode(k)]'>[span_red(k)]</a>"
body += "<a href='byond://?_src_=holder;[HrefToken()];toglang=[REF(player)];lang=[html_encode(k)]'>[span_red(k)]</a>"
body += {"<br>"}
@@ -279,28 +279,28 @@ ADMIN_VERB(access_news_network, R_ADMIN|R_EVENT, "Access Newscaster Network", "A
var/datum/admins/admin_holder = user.holder
switch(admin_holder.admincaster_screen)
if(0)
dat += {"Welcome to the admin newscaster.<BR> Here you can add, edit and censor every newspiece on the network.
<BR>Feed channels and stories entered through here will be uneditable and handled as official news by the rest of the units.
<BR>Note that this panel allows full freedom over the news network, there are no constrictions except the few basic ones. Don't break things!
dat += {"Welcome to the admin newscaster.<br> Here you can add, edit and censor every newspiece on the network.
<br>Feed channels and stories entered through here will be uneditable and handled as official news by the rest of the units.
<br>Note that this panel allows full freedom over the news network, there are no constrictions except the few basic ones. Don't break things!
"}
if(GLOB.news_network.wanted_issue)
dat+= "<HR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_view_wanted=1'>Read Wanted Issue</A>"
dat+= "<HR><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_view_wanted=1'>Read Wanted Issue</a>"
dat+= {"<HR><BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_create_channel=1'>Create Feed Channel</A>
<BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_view=1'>View Feed Channels</A>
<BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_create_feed_story=1'>Submit new Feed story</A>
<BR><BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];mach_close=newscaster_main'>Exit</A>
dat+= {"<HR><br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_create_channel=1'>Create Feed Channel</a>
<br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_view=1'>View Feed Channels</a>
<br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_create_feed_story=1'>Submit new Feed story</a>
<br><br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];mach_close=newscaster_main'>Exit</a>
"}
var/wanted_already = 0
if(GLOB.news_network.wanted_issue)
wanted_already = 1
dat+={"<HR>"} + span_bold("Feed Security functions:") + {"<BR>
<BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_menu_wanted=1'>[(wanted_already) ? ("Manage") : ("Publish")] \"Wanted\" Issue</A>
<BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_menu_censor_story=1'>Censor Feed Stories</A>
<BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_menu_censor_channel=1'>Mark Feed Channel with [using_map.company_name] D-Notice (disables and locks the channel.</A>
<BR><HR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_set_signature=1'>The newscaster recognises you as:<BR>"} + span_green("[admin_holder.admincaster_signature]") + {"</A>
dat+={"<HR>"} + span_bold("Feed Security functions:") + {"<br>
<br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_menu_wanted=1'>[(wanted_already) ? ("Manage") : ("Publish")] \"Wanted\" Issue</a>
<br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_menu_censor_story=1'>Censor Feed Stories</a>
<br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_menu_censor_channel=1'>Mark Feed Channel with [using_map.company_name] D-Notice (disables and locks the channel.</a>
<br><HR><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_set_signature=1'>The newscaster recognises you as:<br>"} + span_green("[admin_holder.admincaster_signature]") + {"</a>
"}
if(1)
dat+= "Station Feed Channels<HR>"
@@ -309,97 +309,97 @@ ADMIN_VERB(access_news_network, R_ADMIN|R_EVENT, "Access Newscaster Network", "A
else
for(var/datum/feed_channel/CHANNEL in GLOB.news_network.network_channels)
if(CHANNEL.is_admin_channel)
dat+=span_bold("<FONT style='BACKGROUND-COLOR: LightGreen'><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_show_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A></FONT>") + "<BR>"
dat+=span_bold("<FONT style='BACKGROUND-COLOR: LightGreen'><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_show_channel=[REF(CHANNEL)]'>[CHANNEL.channel_name]</a></FONT>") + "<br>"
else
dat+=span_bold("<A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_show_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? (span_red("***")) : null]<BR>")
dat+={"<BR><HR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_refresh=1'>Refresh</A>
<BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_setScreen=[0]'>Back</A>
dat+=span_bold("<a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_show_channel=[REF(CHANNEL)]'>[CHANNEL.channel_name]</a> [(CHANNEL.censored) ? (span_red("***")) : null]<br>")
dat+={"<br><HR><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_refresh=1'>Refresh</a>
<br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_setScreen=[0]'>Back</a>
"}
if(2)
dat+={"
Creating new Feed Channel...
<HR>"} + span_bold("<A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_set_channel_name=1'>Channel Name</A>:") + {" [admin_holder.admincaster_feed_channel.channel_name]<BR>
"} + span_bold("<A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_set_signature=1'>Channel Author</A>:") + {" "} + span_green("[admin_holder.admincaster_signature]") + {"<BR>
"} + span_bold("<A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_set_channel_lock=1'>Will Accept Public Feeds</A>:") + {" [(admin_holder.admincaster_feed_channel.locked) ? ("NO") : ("YES")]<BR><BR>
<BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_submit_new_channel=1'>Submit</A><BR><BR><A href='byond://?src=\ref[src];[HrefToken()];ac_setScreen=[0]'>Cancel</A><BR>
<HR>"} + span_bold("<a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_set_channel_name=1'>Channel Name</a>:") + {" [admin_holder.admincaster_feed_channel.channel_name]<br>
"} + span_bold("<a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_set_signature=1'>Channel Author</a>:") + {" "} + span_green("[admin_holder.admincaster_signature]") + {"<br>
"} + span_bold("<a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_set_channel_lock=1'>Will Accept Public Feeds</a>:") + {" [(admin_holder.admincaster_feed_channel.locked) ? ("NO") : ("YES")]<br><br>
<br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_submit_new_channel=1'>Submit</a><br><br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_setScreen=[0]'>Cancel</a><br>
"}
if(3)
dat+={"
Creating new Feed Message...
<HR>"} + span_bold("<A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_set_channel_receiving=1'>Receiving Channel</A>:") + {" [admin_holder.admincaster_feed_channel.channel_name]<BR>
"} + span_bold("Message Author:") + {" "} + span_green("[admin_holder.admincaster_signature]") + {"<BR>
"} + span_bold("<A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_set_new_message=1'>Message Body</A>:") + {" [admin_holder.admincaster_feed_message.body] <BR>
<BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_submit_new_message=1'>Submit</A><BR><BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_setScreen=[0]'>Cancel</A><BR>
<HR>"} + span_bold("<a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_set_channel_receiving=1'>Receiving Channel</a>:") + {" [admin_holder.admincaster_feed_channel.channel_name]<br>
"} + span_bold("Message Author:") + {" "} + span_green("[admin_holder.admincaster_signature]") + {"<br>
"} + span_bold("<a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_set_new_message=1'>Message Body</a>:") + {" [admin_holder.admincaster_feed_message.body] <br>
<br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_submit_new_message=1'>Submit</a><br><br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_setScreen=[0]'>Cancel</a><br>
"}
if(4)
dat+={"
Feed story successfully submitted to [admin_holder.admincaster_feed_channel.channel_name].<BR><BR>
<BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_setScreen=[0]'>Return</A><BR>
Feed story successfully submitted to [admin_holder.admincaster_feed_channel.channel_name].<br><br>
<br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_setScreen=[0]'>Return</a><br>
"}
if(5)
dat+={"
Feed Channel [admin_holder.admincaster_feed_channel.channel_name] created successfully.<BR><BR>
<BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_setScreen=[0]'>Return</A><BR>
Feed Channel [admin_holder.admincaster_feed_channel.channel_name] created successfully.<br><br>
<br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_setScreen=[0]'>Return</a><br>
"}
if(6)
dat+=span_bold(span_maroon("ERROR: Could not submit Feed story to Network.")) + "<HR><BR>"
dat+=span_bold(span_maroon("ERROR: Could not submit Feed story to Network.")) + "<HR><br>"
if(admin_holder.admincaster_feed_channel.channel_name=="")
dat+=span_maroon("•Invalid receiving channel name.") + "<BR>"
dat+=span_maroon("•Invalid receiving channel name.") + "<br>"
if(admin_holder.admincaster_feed_message.body == "" || admin_holder.admincaster_feed_message.body == "\[REDACTED\]" || admin_holder.admincaster_feed_message.title == "")
dat+=span_maroon("•Invalid message body.") + "<BR>"
dat+="<BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_setScreen=[3]'>Return</A><BR>"
dat+=span_maroon("•Invalid message body.") + "<br>"
dat+="<br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_setScreen=[3]'>Return</a><br>"
if(7)
dat+=span_bold(span_maroon("ERROR: Could not submit Feed Channel to Network.")) + "<HR><BR>"
dat+=span_bold(span_maroon("ERROR: Could not submit Feed Channel to Network.")) + "<HR><br>"
if(admin_holder.admincaster_feed_channel.channel_name =="" || admin_holder.admincaster_feed_channel.channel_name == "\[REDACTED\]")
dat+=span_maroon("•Invalid channel name.") + "<BR>"
dat+=span_maroon("•Invalid channel name.") + "<br>"
var/check = 0
for(var/datum/feed_channel/FC in GLOB.news_network.network_channels)
if(FC.channel_name == admin_holder.admincaster_feed_channel.channel_name)
check = 1
break
if(check)
dat+=span_maroon("•Channel name already in use.") + "<BR>"
dat+="<BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_setScreen=[2]'>Return</A><BR>"
dat+=span_maroon("•Channel name already in use.") + "<br>"
dat+="<br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_setScreen=[2]'>Return</a><br>"
if(9)
dat+=span_bold("[admin_holder.admincaster_feed_channel.channel_name]: ") + span_small("\[created by: [span_maroon("[admin_holder.admincaster_feed_channel.author]")]\]") + "<HR>"
if(admin_holder.admincaster_feed_channel.censored)
dat+={"
"} + span_red(span_bold("ATTENTION: ")) + {"This channel has been deemed as threatening to the welfare of the station, and marked with a [using_map.company_name] D-Notice.<BR>
No further feed story additions are allowed while the D-Notice is in effect.<BR><BR>
"} + span_red(span_bold("ATTENTION: ")) + {"This channel has been deemed as threatening to the welfare of the station, and marked with a [using_map.company_name] D-Notice.<br>
No further feed story additions are allowed while the D-Notice is in effect.<br><br>
"}
else
if( isemptylist(admin_holder.admincaster_feed_channel.messages) )
dat+=span_italics("No feed messages found in channel...") + "<BR>"
dat+=span_italics("No feed messages found in channel...") + "<br>"
else
var/i = 0
for(var/datum/feed_message/MESSAGE in admin_holder.admincaster_feed_channel.messages)
i++
//dat+="-[MESSAGE.body] <BR>"
//dat+="-[MESSAGE.body] <br>"
var/pic_data
if(MESSAGE.img)
user << browse_rsc(MESSAGE.img, "tmp_photo[i].png")
pic_data+="<img src='tmp_photo[i].png' width = '180'><BR>"
dat+= get_newspaper_content(MESSAGE.title, MESSAGE.body, MESSAGE.author,"#d4cec1", pic_data)
dat+="<BR>"
dat+=span_small("\[Story by [span_maroon("[MESSAGE.author] - [MESSAGE.time_stamp]")]\]") + "<BR>"
dat+="<br>"
dat+=span_small("\[Story by [span_maroon("[MESSAGE.author] - [MESSAGE.time_stamp]")]\]") + "<br>"
dat+={"
<BR><HR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_refresh=1'>Refresh</A>
<BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_setScreen=[1]'>Back</A>
<br><HR><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_refresh=1'>Refresh</a>
<br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_setScreen=[1]'>Back</a>
"}
if(10)
dat+={"
"} + span_bold("[using_map.company_name] Feed Censorship Tool") + {"<BR>
"} + span_small("NOTE: Due to the nature of news Feeds, total deletion of a Feed Story is not possible.<BR>") + {"
"} + span_bold("[using_map.company_name] Feed Censorship Tool") + {"<br>
"} + span_small("NOTE: Due to the nature of news Feeds, total deletion of a Feed Story is not possible.<br>") + {"
"} + span_small("Keep in mind that users attempting to view a censored feed will instead see the \[REDACTED\] tag above it.") + {"
<HR>Select Feed channel to get Stories from:<BR>
<HR>Select Feed channel to get Stories from:<br>
"}
if(isemptylist(GLOB.news_network.network_channels))
dat+=span_italics("No feed channels found active...") + "<BR>"
dat+=span_italics("No feed channels found active...") + "<br>"
else
for(var/datum/feed_channel/CHANNEL in GLOB.news_network.network_channels)
dat+="<A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_pick_censor_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? (span_red("***")) : null]<BR>"
dat+="<BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_setScreen=[0]'>Cancel</A>"
dat+="<a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_pick_censor_channel=[REF(CHANNEL)]'>[CHANNEL.channel_name]</a> [(CHANNEL.censored) ? (span_red("***")) : null]<br>"
dat+="<br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_setScreen=[0]'>Cancel</a>"
if(11)
dat+={"
"} + span_bold("[using_map.company_name] D-Notice Handler") + {"<HR>
@@ -408,44 +408,44 @@ ADMIN_VERB(access_news_network, R_ADMIN|R_EVENT, "Access Newscaster Network", "A
"} + span_small("stories it might contain at the time. You can lift a D-Notice if you have the required access at any time.") + {"<HR>
"}
if(isemptylist(GLOB.news_network.network_channels))
dat+=span_italics("No feed channels found active...") + "<BR>"
dat+=span_italics("No feed channels found active...") + "<br>"
else
for(var/datum/feed_channel/CHANNEL in GLOB.news_network.network_channels)
dat+="<A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_pick_d_notice=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? (span_red("***")) : null]<BR>"
dat+="<a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_pick_d_notice=[REF(CHANNEL)]'>[CHANNEL.channel_name]</a> [(CHANNEL.censored) ? (span_red("***")) : null]<br>"
dat+="<BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_setScreen=[0]'>Back</A>"
dat+="<br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_setScreen=[0]'>Back</a>"
if(12)
dat+={"
"} + span_bold("[admin_holder.admincaster_feed_channel.channel_name]: ") + span_small("\[ created by: [span_maroon("[admin_holder.admincaster_feed_channel.author]")] \]") + {"<BR>
"} + span_normal("<A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_censor_channel_author=\ref[admin_holder.admincaster_feed_channel]'>[(admin_holder.admincaster_feed_channel.author=="\[REDACTED\]") ? ("Undo Author censorship") : ("Censor channel Author")]</A>") + {"<HR>
"} + span_bold("[admin_holder.admincaster_feed_channel.channel_name]: ") + span_small("\[ created by: [span_maroon("[admin_holder.admincaster_feed_channel.author]")] \]") + {"<br>
"} + span_normal("<a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_censor_channel_author=[REF(admin_holder.admincaster_feed_channel)]'>[(admin_holder.admincaster_feed_channel.author=="\[REDACTED\]") ? ("Undo Author censorship") : ("Censor channel Author")]</a>") + {"<HR>
"}
if( isemptylist(admin_holder.admincaster_feed_channel.messages) )
dat+=span_italics("No feed messages found in channel...") + "<BR>"
dat+=span_italics("No feed messages found in channel...") + "<br>"
else
for(var/datum/feed_message/MESSAGE in admin_holder.admincaster_feed_channel.messages)
dat+={"
-[MESSAGE.body] <BR>"} + span_small("\[Story by [span_maroon("[MESSAGE.author]")]\]") + {"<BR>
"} + span_normal("<A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_censor_channel_story_body=\ref[MESSAGE]'>[(MESSAGE.body == "\[REDACTED\]") ? ("Undo story censorship") : ("Censor story")]</A> - <A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_censor_channel_story_author=\ref[MESSAGE]'>[(MESSAGE.author == "\[REDACTED\]") ? ("Undo Author Censorship") : ("Censor message Author")]</A>") + {"<BR>
-[MESSAGE.body] <br>"} + span_small("\[Story by [span_maroon("[MESSAGE.author]")]\]") + {"<br>
"} + span_normal("<a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_censor_channel_story_body=[REF(MESSAGE)]'>[(MESSAGE.body == "\[REDACTED\]") ? ("Undo story censorship") : ("Censor story")]</a> - <a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_censor_channel_story_author=[REF(MESSAGE)]'>[(MESSAGE.author == "\[REDACTED\]") ? ("Undo Author Censorship") : ("Censor message Author")]</a>") + {"<br>
"}
dat+="<BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_setScreen=[10]'>Back</A>"
dat+="<br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_setScreen=[10]'>Back</a>"
if(13)
dat+={"
"} + span_bold("[admin_holder.admincaster_feed_channel.channel_name]: ") + span_small("\[ created by: [span_maroon("[admin_holder.admincaster_feed_channel.author]")] \]") + {"<BR>
Channel messages listed below. If you deem them dangerous to the station, you can <A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_toggle_d_notice=\ref[admin_holder.admincaster_feed_channel]'>Bestow a D-Notice upon the channel</A>.<HR>
"} + span_bold("[admin_holder.admincaster_feed_channel.channel_name]: ") + span_small("\[ created by: [span_maroon("[admin_holder.admincaster_feed_channel.author]")] \]") + {"<br>
Channel messages listed below. If you deem them dangerous to the station, you can <a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_toggle_d_notice=[REF(admin_holder.admincaster_feed_channel)]'>Bestow a D-Notice upon the channel</a>.<HR>
"}
if(admin_holder.admincaster_feed_channel.censored)
dat+={"
"} + span_red(span_bold("ATTENTION: ")) + {"This channel has been deemed as threatening to the welfare of the station, and marked with a [using_map.company_name] D-Notice.<BR>
No further feed story additions are allowed while the D-Notice is in effect.<BR><BR>
"} + span_red(span_bold("ATTENTION: ")) + {"This channel has been deemed as threatening to the welfare of the station, and marked with a [using_map.company_name] D-Notice.<br>
No further feed story additions are allowed while the D-Notice is in effect.<br><br>
"}
else
if( isemptylist(admin_holder.admincaster_feed_channel.messages) )
dat+=span_italics("No feed messages found in channel...") + "<BR>"
dat+=span_italics("No feed messages found in channel...") + "<br>"
else
for(var/datum/feed_message/MESSAGE in admin_holder.admincaster_feed_channel.messages)
dat+="-[MESSAGE.body] <BR>" + span_small("\[Story by [span_maroon("[MESSAGE.author]")]\]") + "<BR>"
dat+="-[MESSAGE.body] <br>" + span_small("\[Story by [span_maroon("[MESSAGE.author]")]\]") + "<br>"
dat+="<BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_setScreen=[11]'>Back</A>"
dat+="<br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_setScreen=[11]'>Back</a>"
if(14)
dat+=span_bold("Wanted Issue Handler:")
var/wanted_already = 0
@@ -454,54 +454,54 @@ ADMIN_VERB(access_news_network, R_ADMIN|R_EVENT, "Access Newscaster Network", "A
wanted_already = 1
end_param = 2
if(wanted_already)
dat+=span_normal(span_italics("<BR>A wanted issue is already in Feed Circulation. You can edit or cancel it below."))
dat+=span_normal(span_italics("<br>A wanted issue is already in Feed Circulation. You can edit or cancel it below."))
dat+={"
<HR>
<A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_set_wanted_name=1'>Criminal Name</A>: [admin_holder.admincaster_feed_message.author] <BR>
<A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_set_wanted_desc=1'>Description</A>: [admin_holder.admincaster_feed_message.body] <BR>
<a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_set_wanted_name=1'>Criminal Name</a>: [admin_holder.admincaster_feed_message.author] <br>
<a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_set_wanted_desc=1'>Description</a>: [admin_holder.admincaster_feed_message.body] <br>
"}
if(wanted_already)
dat+=span_bold("Wanted Issue created by:") + span_green(" [GLOB.news_network.wanted_issue.backup_author]") + "<BR>"
dat+=span_bold("Wanted Issue created by:") + span_green(" [GLOB.news_network.wanted_issue.backup_author]") + "<br>"
else
dat+=span_bold("Wanted Issue will be created under prosecutor:") + span_green(" [admin_holder.admincaster_signature]") + "<BR>"
dat+="<BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_submit_wanted=[end_param]'>[(wanted_already) ? ("Edit Issue") : ("Submit")]</A>"
dat+=span_bold("Wanted Issue will be created under prosecutor:") + span_green(" [admin_holder.admincaster_signature]") + "<br>"
dat+="<br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_submit_wanted=[end_param]'>[(wanted_already) ? ("Edit Issue") : ("Submit")]</a>"
if(wanted_already)
dat+="<BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_cancel_wanted=1'>Take down Issue</A>"
dat+="<BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_setScreen=[0]'>Cancel</A>"
dat+="<br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_cancel_wanted=1'>Take down Issue</a>"
dat+="<br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_setScreen=[0]'>Cancel</a>"
if(15)
dat+={"
"} + span_green("Wanted issue for [admin_holder.admincaster_feed_message.author] is now in Network Circulation.") + {"<BR><BR>
<BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_setScreen=[0]'>Return</A><BR>
"} + span_green("Wanted issue for [admin_holder.admincaster_feed_message.author] is now in Network Circulation.") + {"<br><br>
<br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_setScreen=[0]'>Return</a><br>
"}
if(16)
dat+=span_bold(span_maroon("ERROR: Wanted Issue rejected by Network.")) + "<HR><BR>"
dat+=span_bold(span_maroon("ERROR: Wanted Issue rejected by Network.")) + "<HR><br>"
if(admin_holder.admincaster_feed_message.author =="" || admin_holder.admincaster_feed_message.author == "\[REDACTED\]")
dat+=span_maroon("•Invalid name for person wanted.") + "<BR>"
dat+=span_maroon("•Invalid name for person wanted.") + "<br>"
if(admin_holder.admincaster_feed_message.body == "" || admin_holder.admincaster_feed_message.body == "\[REDACTED\]")
dat+=span_maroon("•Invalid description.") + "<BR>"
dat+="<BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_setScreen=[0]'>Return</A><BR>"
dat+=span_maroon("•Invalid description.") + "<br>"
dat+="<br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_setScreen=[0]'>Return</a><br>"
if(17)
dat+={"
"} + span_bold("Wanted Issue successfully deleted from Circulation") + {"<BR>
<BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_setScreen=[0]'>Return</A><BR>
"} + span_bold("Wanted Issue successfully deleted from Circulation") + {"<br>
<br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_setScreen=[0]'>Return</a><br>
"}
if(18)
dat+={"
"} + span_bold(span_maroon("-- STATIONWIDE WANTED ISSUE --")) + {"<BR>"} + span_normal("\[Submitted by: [span_green("[GLOB.news_network.wanted_issue.backup_author]")]\]") + {"<HR>
"} + span_bold("Criminal") + {": [GLOB.news_network.wanted_issue.author]<BR>
"} + span_bold("Description") + {": [GLOB.news_network.wanted_issue.body]<BR>
"} + span_bold(span_maroon("-- STATIONWIDE WANTED ISSUE --")) + {"<br>"} + span_normal("\[Submitted by: [span_green("[GLOB.news_network.wanted_issue.backup_author]")]\]") + {"<HR>
"} + span_bold("Criminal") + {": [GLOB.news_network.wanted_issue.author]<br>
"} + span_bold("Description") + {": [GLOB.news_network.wanted_issue.body]<br>
"} + span_bold("Photo:") + {":
"}
if(GLOB.news_network.wanted_issue.img)
user << browse_rsc(GLOB.news_network.wanted_issue.img, "tmp_photow.png")
dat+="<BR><img src='tmp_photow.png' width = '180'>"
dat+="<br><img src='tmp_photow.png' width = '180'>"
else
dat+="None"
dat+="<BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_setScreen=[0]'>Back</A><BR>"
dat+="<br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_setScreen=[0]'>Back</a><br>"
if(19)
dat+={"
"} + span_green("Wanted issue for [admin_holder.admincaster_feed_message.author] successfully edited.") + {"<BR><BR>
<BR><A href='byond://?src=\ref[admin_holder];[HrefToken()];ac_setScreen=[0]'>Return</A><BR>
"} + span_green("Wanted issue for [admin_holder.admincaster_feed_message.author] successfully edited.") + {"<br><br>
<br><a href='byond://?src=[REF(admin_holder)];[HrefToken()];ac_setScreen=[0]'>Return</a><br>
"}
else
dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com"
@@ -523,7 +523,7 @@ ADMIN_VERB(access_news_network, R_ADMIN|R_EVENT, "Access Newscaster Network", "A
var/r = t
if( findtext(r,"##") )
r = copytext( r, 1, findtext(r,"##") )//removes the description
dat += text("<tr><td>[t] (<A href='byond://?src=\ref[src];[HrefToken()];removejobban=[r]'>unban</A>)</td></tr>")
dat += text("<tr><td>[t] (<a href='byond://?src=[REF(src)];[HrefToken()];removejobban=[r]'>unban</a>)</td></tr>")
dat += "</table>"
var/datum/browser/popup = new(owner, "ban", "Job Bans", 400, 400)
@@ -536,20 +536,17 @@ ADMIN_VERB(access_news_network, R_ADMIN|R_EVENT, "Access Newscaster Network", "A
var/dat = {"
<center>"} + span_bold("Game Panel") + {"</center><hr>\n
<A href='byond://?src=\ref[src];[HrefToken()];c_mode=1'>Change Game Mode</A><br>
<a href='byond://?src=[REF(src)];[HrefToken()];c_mode=1'>Change Game Mode</a><br>
"}
if(GLOB.master_mode == "secret")
dat += "<A href='byond://?src=\ref[src];[HrefToken()];f_secret=1'>(Force Secret Mode)</A><br>"
dat += "<a href='byond://?src=[REF(src)];[HrefToken()];f_secret=1'>(Force Secret Mode)</a><br>"
dat += {"
<BR>
<A href='byond://?src=\ref[src];[HrefToken()];create_object=1'>Create Object</A><br>
<A href='byond://?src=\ref[src];[HrefToken()];quick_create_object=1'>Quick Create Object</A><br>
<A href='byond://?src=\ref[src];[HrefToken()];create_turf=1'>Create Turf</A><br>
<A href='byond://?src=\ref[src];[HrefToken()];create_mob=1'>Create Mob</A><br>
<br><A href='byond://?src=\ref[src];[HrefToken()];vsc=airflow'>Edit Airflow Settings</A><br>
<A href='byond://?src=\ref[src];[HrefToken()];vsc=phoron'>Edit Phoron Settings</A><br>
<A href='byond://?src=\ref[src];[HrefToken()];vsc=default'>Choose a default ZAS setting</A><br>
<br>
<a href='byond://?src=[REF(src)];[HrefToken()];spawn_panel=1'>Spawn Panel</a><br>
<br><a href='byond://?src=[REF(src)];[HrefToken()];vsc=airflow'>Edit Airflow Settings</a><br>
<a href='byond://?src=[REF(src)];[HrefToken()];vsc=phoron'>Edit Phoron Settings</a><br>
<a href='byond://?src=[REF(src)];[HrefToken()];vsc=default'>Choose a default ZAS setting</a><br>
"}
var/datum/browser/popup = new(owner, "admin2", "Game Panel", 220, 295)
@@ -565,19 +562,19 @@ ADMIN_VERB(access_news_network, R_ADMIN|R_EVENT, "Access Newscaster Network", "A
for(var/datum/admin_secret_category/category in admin_secrets.categories)
if(!category.can_view(usr))
continue
dat += "<A href='byond://?src=\ref[src];[HrefToken()];admin_secrets_panel=\ref[category]'>[category.name]</A> "
dat += "<a href='byond://?src=[REF(src)];[HrefToken()];admin_secrets_panel=[REF(category)]'>[category.name]</a> "
dat += "<HR>"
// If a category is selected, print its description and then options
if(istype(active_category) && active_category.can_view(usr))
dat += span_bold("[active_category.name]") + "<BR>"
dat += span_bold("[active_category.name]") + "<br>"
if(active_category.desc)
dat += span_italics("[active_category.desc]") + "<BR>"
dat += span_italics("[active_category.desc]") + "<br>"
for(var/datum/admin_secret_item/item in active_category.items)
if(!item.can_view(usr))
continue
dat += "<A href='byond://?src=\ref[src];[HrefToken()];admin_secrets=\ref[item]'>[item.name()]</A><BR>"
dat += "<BR>"
dat += "<a href='byond://?src=[REF(src)];[HrefToken()];admin_secrets=[REF(item)]'>[item.name()]</a><br>"
dat += "<br>"
var/datum/browser/popup = new(usr, "secrets", "Secrets", 500, 500)
popup.set_content(dat)
@@ -1072,66 +1069,66 @@ ADMIN_VERB(show_game_mode, R_ADMIN|R_EVENT, "Show Game Mode", "Show the current
tgui_alert_async(user, "Not before roundstart!", "Alert")
return
var/out = span_large(span_bold("Current mode: [SSticker.mode.name] (<a href='byond://?src=\ref[SSticker.mode];[HrefToken()];debug_antag=self'>[SSticker.mode.config_tag]</a>)")) + "<br/>"
var/out = span_large(span_bold("Current mode: [SSticker.mode.name] (<a href='byond://?src=[REF(SSticker.mode)];[HrefToken()];debug_antag=self'>[SSticker.mode.config_tag]</a>)")) + "<br/>"
out += "<hr>"
if(SSticker.mode.ert_disabled)
out += span_bold("Emergency Response Teams:") + "<a href='byond://?src=\ref[SSticker.mode];[HrefToken()];toggle=ert'>disabled</a>"
out += span_bold("Emergency Response Teams:") + "<a href='byond://?src=[REF(SSticker.mode)];[HrefToken()];toggle=ert'>disabled</a>"
else
out += span_bold("Emergency Response Teams:") + "<a href='byond://?src=\ref[SSticker.mode];[HrefToken()];toggle=ert'>enabled</a>"
out += span_bold("Emergency Response Teams:") + "<a href='byond://?src=[REF(SSticker.mode)];[HrefToken()];toggle=ert'>enabled</a>"
out += "<br/>"
if(SSticker.mode.deny_respawn)
out += span_bold("Respawning:") + "<a href='byond://?src=\ref[SSticker.mode];[HrefToken()];toggle=respawn'>disallowed</a>"
out += span_bold("Respawning:") + "<a href='byond://?src=[REF(SSticker.mode)];[HrefToken()];toggle=respawn'>disallowed</a>"
else
out += span_bold("Respawning:") + "<a href='byond://?src=\ref[SSticker.mode];[HrefToken()];toggle=respawn'>allowed</a>"
out += span_bold("Respawning:") + "<a href='byond://?src=[REF(SSticker.mode)];[HrefToken()];toggle=respawn'>allowed</a>"
out += "<br/>"
out += span_bold("Shuttle delay multiplier:") + " <a href='byond://?src=\ref[SSticker.mode];[HrefToken()];set=shuttle_delay'>[SSticker.mode.shuttle_delay]</a><br/>"
out += span_bold("Shuttle delay multiplier:") + " <a href='byond://?src=[REF(SSticker.mode)];[HrefToken()];set=shuttle_delay'>[SSticker.mode.shuttle_delay]</a><br/>"
if(SSticker.mode.auto_recall_shuttle)
out += span_bold("Shuttle auto-recall:") + " <a href='byond://?src=\ref[SSticker.mode];[HrefToken()];toggle=shuttle_recall'>enabled</a>"
out += span_bold("Shuttle auto-recall:") + " <a href='byond://?src=[REF(SSticker.mode)];[HrefToken()];toggle=shuttle_recall'>enabled</a>"
else
out += span_bold("Shuttle auto-recall:") + " <a href='byond://?src=\ref[SSticker.mode];[HrefToken()];toggle=shuttle_recall'>disabled</a>"
out += span_bold("Shuttle auto-recall:") + " <a href='byond://?src=[REF(SSticker.mode)];[HrefToken()];toggle=shuttle_recall'>disabled</a>"
out += "<br/><br/>"
if(SSticker.mode.event_delay_mod_moderate)
out += span_bold("Moderate event time modifier:") + " <a href='byond://?src=\ref[SSticker.mode];[HrefToken()];set=event_modifier_moderate'>[SSticker.mode.event_delay_mod_moderate]</a><br/>"
out += span_bold("Moderate event time modifier:") + " <a href='byond://?src=[REF(SSticker.mode)];[HrefToken()];set=event_modifier_moderate'>[SSticker.mode.event_delay_mod_moderate]</a><br/>"
else
out += span_bold("Moderate event time modifier:") + " <a href='byond://?src=\ref[SSticker.mode];[HrefToken()];set=event_modifier_moderate'>unset</a><br/>"
out += span_bold("Moderate event time modifier:") + " <a href='byond://?src=[REF(SSticker.mode)];[HrefToken()];set=event_modifier_moderate'>unset</a><br/>"
if(SSticker.mode.event_delay_mod_major)
out += span_bold("Major event time modifier:") + " <a href='byond://?src=\ref[SSticker.mode];[HrefToken()];set=event_modifier_severe'>[SSticker.mode.event_delay_mod_major]</a><br/>"
out += span_bold("Major event time modifier:") + " <a href='byond://?src=[REF(SSticker.mode)];[HrefToken()];set=event_modifier_severe'>[SSticker.mode.event_delay_mod_major]</a><br/>"
else
out += span_bold("Major event time modifier:") + " <a href='byond://?src=\ref[SSticker.mode];[HrefToken()];set=event_modifier_severe'>unset</a><br/>"
out += span_bold("Major event time modifier:") + " <a href='byond://?src=[REF(SSticker.mode)];[HrefToken()];set=event_modifier_severe'>unset</a><br/>"
out += "<hr>"
if(SSticker.mode.antag_tags && SSticker.mode.antag_tags.len)
out += span_bold("Core antag templates:") + "</br>"
for(var/antag_tag in SSticker.mode.antag_tags)
out += "<a href='byond://?src=\ref[SSticker.mode];[HrefToken()];debug_antag=[antag_tag]'>[antag_tag]</a>.</br>"
out += "<a href='byond://?src=[REF(SSticker.mode)];[HrefToken()];debug_antag=[antag_tag]'>[antag_tag]</a>.</br>"
if(SSticker.mode.round_autoantag)
out += span_bold("Autotraitor <a href='byond://?src=\ref[SSticker.mode];[HrefToken()];toggle=autotraitor'>enabled</a>.")
out += span_bold("Autotraitor <a href='byond://?src=[REF(SSticker.mode)];[HrefToken()];toggle=autotraitor'>enabled</a>.")
if(SSticker.mode.antag_scaling_coeff > 0)
out += " (scaling with <a href='byond://?src=\ref[SSticker.mode];[HrefToken()];set=antag_scaling'>[SSticker.mode.antag_scaling_coeff]</a>)"
out += " (scaling with <a href='byond://?src=[REF(SSticker.mode)];[HrefToken()];set=antag_scaling'>[SSticker.mode.antag_scaling_coeff]</a>)"
else
out += " (not currently scaling, <a href='byond://?src=\ref[SSticker.mode];[HrefToken()];set=antag_scaling'>set a coefficient</a>)"
out += " (not currently scaling, <a href='byond://?src=[REF(SSticker.mode)];[HrefToken()];set=antag_scaling'>set a coefficient</a>)"
out += "<br/>"
else
out += span_bold("Autotraitor <a href='byond://?src=\ref[SSticker.mode];[HrefToken()];toggle=autotraitor'>disabled</a>.") + "<br/>"
out += span_bold("Autotraitor <a href='byond://?src=[REF(SSticker.mode)];[HrefToken()];toggle=autotraitor'>disabled</a>.") + "<br/>"
out += span_bold("All antag ids:")
if(SSticker.mode.antag_templates && SSticker.mode.antag_templates.len)
for(var/datum/antagonist/antag in SSticker.mode.antag_templates)
antag.update_current_antag_max()
out += " <a href='byond://?src=\ref[SSticker.mode];[HrefToken()];debug_antag=[antag.id]'>[antag.id]</a>"
out += " <a href='byond://?src=[REF(SSticker.mode)];[HrefToken()];debug_antag=[antag.id]'>[antag.id]</a>"
out += " ([antag.get_antag_count()]/[antag.cur_max]) "
out += " <a href='byond://?src=\ref[SSticker.mode];[HrefToken()];remove_antag_type=[antag.id]'>\[-\]</a><br/>"
out += " <a href='byond://?src=[REF(SSticker.mode)];[HrefToken()];remove_antag_type=[antag.id]'>\[-\]</a><br/>"
else
out += " None."
out += " <a href='byond://?src=\ref[SSticker.mode];[HrefToken()];add_antag_type=1'>\[+\]</a><br/>"
out += " <a href='byond://?src=[REF(SSticker.mode)];[HrefToken()];add_antag_type=1'>\[+\]</a><br/>"
var/datum/browser/popup = new(user, "edit_mode[user.holder]", "Edit Game Mode")
popup.set_content(out)
@@ -1188,19 +1185,19 @@ ADMIN_VERB(toggleguests, R_HOST, "Toggle guests", "Guests can't enter.", ADMIN_C
return span_bold("[key_name(C, link, name, highlight_special)]")
if(1) //Private Messages
return span_bold("[key_name(C, link, name, highlight_special)](<A href='byond://?_src_=holder;[HrefToken()];adminmoreinfo=\ref[M]'>?</A>)")
return span_bold("[key_name(C, link, name, highlight_special)](<a href='byond://?_src_=holder;[HrefToken()];adminmoreinfo=[REF(M)]'>?</a>)")
if(2) //Admins
var/ref_mob = "\ref[M]"
return span_bold("[key_name(C, link, name, highlight_special)](<A href='byond://?_src_=holder;[HrefToken()];adminmoreinfo=[ref_mob]'>?</A>) (<A href='byond://?_src_=holder;[HrefToken()];adminplayeropts=[ref_mob]'>PP</A>) (<A href='byond://?_src_=vars;[HrefToken()];Vars=[ref_mob]'>VV</A>) (<A href='byond://?_src_=holder;[HrefToken()];subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(M)]) (<A href='byond://?_src_=holder;[HrefToken()];check_antagonist=1'>CA</A>) (<A href='byond://?_src_=holder;[HrefToken()];take_question=\ref[M]'>TAKE</A>)")
var/ref_mob = "[REF(M)]"
return span_bold("[key_name(C, link, name, highlight_special)](<a href='byond://?_src_=holder;[HrefToken()];adminmoreinfo=[ref_mob]'>?</a>) (<a href='byond://?_src_=holder;[HrefToken()];adminplayeropts=[ref_mob]'>PP</a>) (<a href='byond://?_src_=vars;[HrefToken()];Vars=[ref_mob]'>VV</a>) (<a href='byond://?_src_=holder;[HrefToken()];subtlemessage=[ref_mob]'>SM</a>) ([admin_jump_link(M)]) (<a href='byond://?_src_=holder;[HrefToken()];check_antagonist=1'>CA</a>) (<a href='byond://?_src_=holder;[HrefToken()];take_question=[REF(M)]'>TAKE</a>)")
if(3) //Devs
var/ref_mob = "\ref[M]"
return span_bold("[key_name(C, link, name, highlight_special)](<A href='byond://?_src_=vars;[HrefToken()];Vars=[ref_mob]'>VV</A>)([admin_jump_link(M)]) (<A href='byond://?_src_=holder;[HrefToken()];take_question=\ref[M]'>TAKE</A>)")
var/ref_mob = "[REF(M)]"
return span_bold("[key_name(C, link, name, highlight_special)](<a href='byond://?_src_=vars;[HrefToken()];Vars=[ref_mob]'>VV</a>)([admin_jump_link(M)]) (<a href='byond://?_src_=holder;[HrefToken()];take_question=[REF(M)]'>TAKE</a>)")
if(4) //Event Managers
var/ref_mob = "\ref[M]"
return span_bold("[key_name(C, link, name, highlight_special)] (<A href='byond://?_src_=holder;[HrefToken()];adminmoreinfo=\ref[M]'>?</A>) (<A href='byond://?_src_=holder;[HrefToken()];adminplayeropts=[ref_mob]'>PP</A>) (<A href='byond://?_src_=vars;[HrefToken()];Vars=[ref_mob]'>VV</A>) (<A href='byond://?_src_=holder;[HrefToken()];subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(M)]) (<A href='byond://?_src_=holder;[HrefToken()];take_question=\ref[M]'>TAKE</A>)")
var/ref_mob = "[REF(M)]"
return span_bold("[key_name(C, link, name, highlight_special)] (<a href='byond://?_src_=holder;[HrefToken()];adminmoreinfo=[REF(M)]'>?</a>) (<a href='byond://?_src_=holder;[HrefToken()];adminplayeropts=[ref_mob]'>PP</a>) (<a href='byond://?_src_=vars;[HrefToken()];Vars=[ref_mob]'>VV</a>) (<a href='byond://?_src_=holder;[HrefToken()];subtlemessage=[ref_mob]'>SM</a>) ([admin_jump_link(M)]) (<a href='byond://?_src_=holder;[HrefToken()];take_question=[REF(M)]'>TAKE</a>)")
/proc/ishost(whom)
@@ -1369,12 +1366,12 @@ ADMIN_VERB(sendFax, R_ADMIN|R_MOD|R_EVENT, "Send Fax", "Sends a fax to this mach
log_admin("[key_name(src.owner)] replied to a fax message from [key_name(P.sender)]")
for(var/client/C in GLOB.admins)
if(check_rights_for(C, (R_ADMIN | R_MOD | R_EVENT)))
to_chat(C, span_log_message("[span_prefix("FAX LOG:")][key_name_admin(src.owner)] replied to a fax message from [key_name_admin(P.sender)] (<a href='byond://?_src_=holder;[HrefToken()];AdminFaxView=\ref[rcvdcopy]'>VIEW</a>)"))
to_chat(C, span_log_message("[span_prefix("FAX LOG:")][key_name_admin(src.owner)] replied to a fax message from [key_name_admin(P.sender)] (<a href='byond://?_src_=holder;[HrefToken()];AdminFaxView=[REF(rcvdcopy)]'>VIEW</a>)"))
else
log_admin("[key_name(src.owner)] has sent a fax message to [destination.department]")
for(var/client/C in GLOB.admins)
if(check_rights_for(C, (R_ADMIN | R_MOD | R_EVENT)))
to_chat(C, span_log_message("[span_prefix("FAX LOG:")][key_name_admin(src.owner)] has sent a fax message to [destination.department] (<a href='byond://?_src_=holder;[HrefToken()];AdminFaxView=\ref[rcvdcopy]'>VIEW</a>)"))
to_chat(C, span_log_message("[span_prefix("FAX LOG:")][key_name_admin(src.owner)] has sent a fax message to [destination.department] (<a href='byond://?_src_=holder;[HrefToken()];AdminFaxView=[REF(rcvdcopy)]'>VIEW</a>)"))
var/plaintext_title = P.sender ? "replied to [key_name(P.sender)]'s fax" : "sent a fax message to [destination.department]"
var/fax_text = paper_html_to_plaintext(P.info)
-9
View File
@@ -1,9 +0,0 @@
/var/create_mob_html = null
/datum/admins/proc/create_mob(var/mob/user)
if (!create_mob_html)
var/mobjs = null
mobjs = jointext(typesof(/mob), ";")
create_mob_html = file2text('html/create_object.html')
create_mob_html = replacetext(create_mob_html, "null /* object types */", "\"[mobjs]\"")
user << browse(create_panel_helper(create_mob_html), "window=create_mob;size=680x600")
-47
View File
@@ -1,47 +0,0 @@
/datum/admins/proc/create_panel_helper(template)
var/final_html = replacetext(template, "/* ref src */", "\ref[src];[HrefToken()]")
final_html = replacetext(final_html,"/* hreftokenfield */","[HrefTokenFormField()]")
return final_html
/datum/admins/proc/create_object(var/mob/user)
var/static/create_object_html = null
if (!create_object_html)
var/objectjs = null
objectjs = jointext(typesof(/obj), ";")
create_object_html = file2text('html/create_object.html')
create_object_html = replacetext(create_object_html, "null /* object types */", "\"[objectjs]\"")
user << browse(create_panel_helper(create_object_html), "window=create_object;size=680x600")
/datum/admins/proc/quick_create_object(var/mob/user)
var/quick_create_object_html = null
var/pathtext = null
var/list/choices = list("/obj",
"/obj/structure",
"/obj/item",
"/obj/item/melee",
"/obj/item/gun",
"/obj/item/reagent_containers",
"/obj/item/reagent_containers/food",
"/obj/item/clothing",
"/obj/item/storage/box/fluff", //VOREStation Edit,
"/obj/machinery",
"/obj/mecha",
"/obj/item/mecha_parts",
"/obj/item/mecha_parts/mecha_equipment")
pathtext = tgui_input_list(usr, "Select the path of the object you wish to create.", "Path", choices, "/obj")
if(!pathtext)
return
var path = text2path(pathtext)
if (!quick_create_object_html)
var/objectjs = null
objectjs = jointext(typesof(path), ";")
quick_create_object_html = file2text('html/create_object.html')
quick_create_object_html = replacetext(quick_create_object_html, "null /* object types */", "\"[objectjs]\"")
user << browse(create_panel_helper(quick_create_object_html), "window=quick_create_object;size=680x600")
-9
View File
@@ -1,9 +0,0 @@
/var/create_turf_html = null
/datum/admins/proc/create_turf(var/mob/user)
if (!create_turf_html)
var/turfjs = null
turfjs = jointext(typesof(/turf), ";")
create_turf_html = file2text('html/create_object.html')
create_turf_html = replacetext(create_turf_html, "null /* object types */", "\"[turfjs]\"")
user << browse(create_panel_helper(create_turf_html), "window=create_turf;size=680x600")
+1
View File
@@ -32,6 +32,7 @@ GLOBAL_PROTECT(href_token)
var/datum/filter_editor/filteriffic
var/datum/particle_editor/particle_test
var/datum/whitelist_editor/whitelist_editor
var/datum/spawnpanel/spawn_panel
/// A lazylist of tagged datums, for quick reference with the View Tags verb
var/list/tagged_datums
+6 -55
View File
@@ -219,63 +219,14 @@
target.module_reset(FALSE)
return TRUE
if("add_module")
var/obj/item/add_item = locate(params["module"])
if(!add_item)
var/obj/item/selected_item = locate(params["module"])
if(!selected_item)
return TRUE
if(istype(add_item, /obj/item/card/id))
if(istype(selected_item, /obj/item/card/id))
source.idcard = null
source.module.emag.Remove(add_item)
source.module.modules.Remove(add_item)
source.module.contents.Remove(add_item)
if(istype(add_item, /obj/item/card/id))
if(target.idcard)
qdel(target.idcard)
target.idcard = add_item
target.module.modules.Add(add_item)
target.module.contents.Add(add_item)
spawn(0)
SEND_SIGNAL(add_item, COMSIG_MOVABLE_ATTEMPTED_MOVE)
target.hud_used?.update_robot_modules_display()
if(istype(add_item, /obj/item/stack/))
var/obj/item/stack/item_with_synth = add_item
for(var/synth in item_with_synth.synths)
var/found = target.module.synths.Find(synth)
if(!found)
source.module.synths.Remove(synth)
target.module.synths.Add(synth)
else
item_with_synth.synths = list(target.module.synths[found])
return TRUE
if(istype(add_item, /obj/item/matter_decompiler/) || istype(add_item, /obj/item/dogborg/sleeper/compactor/decompiler/))
var/obj/item/matter_decompiler/item_with_matter = add_item
if(item_with_matter.metal)
var/found = target.module.synths.Find(item_with_matter.metal)
if(!found)
source.module.synths.Remove(item_with_matter.metal)
target.module.synths.Add(item_with_matter.metal)
else
item_with_matter.metal = target.module.synths[found]
if(item_with_matter.glass)
var/found = target.module.synths.Find(item_with_matter.glass)
if(!found)
source.module.synths.Remove(item_with_matter.glass)
target.module.synths.Add(item_with_matter.glass)
else
item_with_matter.glass = target.module.synths[found]
if(item_with_matter.wood)
var/found = target.module.synths.Find(item_with_matter.wood)
if(!found)
source.module.synths.Remove(item_with_matter.wood)
target.module.synths.Add(item_with_matter.wood)
else
item_with_matter.wood = target.module.synths[found]
if(item_with_matter.plastic)
var/found = target.module.synths.Find(item_with_matter.plastic)
if(!found)
source.module.synths.Remove(item_with_matter.plastic)
target.module.synths.Add(item_with_matter.plastic)
else
item_with_matter.plastic = target.module.synths[found]
source.module.emag -= selected_item
source.module.modules -= selected_item
target.module.add_item(selected_item, target)
return TRUE
if("rem_module")
var/obj/item/rem_item = locate(params["module"])
@@ -0,0 +1,9 @@
// Open "View Variables" menu for target
/mob/observer/dead/CtrlShiftClickOn(atom/target)
if(check_rights(R_DEBUG))
SSadmin_verbs.dynamic_invoke_verb(client, /datum/admin_verb/debug_variables, target)
// Open "Show Player Panel" menu for target mob
/mob/observer/dead/CtrlClickOn(atom/target)
if(check_rights(R_ADMIN) && ismob(target))
SSadmin_verbs.dynamic_invoke_verb(client, /datum/admin_verb/show_player_panel, target)
+51
View File
@@ -0,0 +1,51 @@
/datum/asset/json/spawnpanel
name = "spawnpanel_atom_data"
/datum/asset/json/spawnpanel/generate()
var/list/data = list()
var/static/list/mapping_objects = typecacheof(list(
/obj/effect/landmark,
/obj/effect/spawner,
/obj/effect/shuttle_landmark,
/obj/effect/floor_decal,
/obj/effect/decal,
/obj/effect/overlay,
/obj/effect/step_trigger,
/obj/effect/overmap,
/obj/effect/zone_divider,
))
data["atoms"] = list()
for(var/obj/each_object as anything in typesof(/obj))
data["atoms"][each_object] = list(
"icon" = /* each_object?.icon_preview ||*/ each_object?.icon || "none",
"icon_state" = /* each_object?.icon_state_preview ||*/ each_object?.icon_state || "none",
"name" = each_object.name,
"description" = each_object.desc,
"mapping" = is_type_in_typecache(each_object, mapping_objects),
"type" = "Objects"
)
for(var/turf/each_turf as anything in typesof(/turf))
data["atoms"][each_turf] = list(
"icon" = each_turf?.icon || "noneturf",
"icon_state" = each_turf?.icon_state || "noneturf",
"name" = each_turf.name,
"description" = each_turf.desc,
"mapping" = is_type_in_typecache(each_turf, mapping_objects),
"type" = "Turfs"
)
for(var/mob/each_mob as anything in typesof(/mob))
data["atoms"][each_mob] = list(
"icon" = each_mob?.icon || "nonemob",
"icon_state" = each_mob?.icon_state || "nonemob",
"name" = each_mob.name,
"description" = each_mob.desc,
"mapping" = is_type_in_typecache(each_mob, mapping_objects),
"type" = "Mobs"
)
return data
@@ -0,0 +1,161 @@
#define WHERE_FLOOR_BELOW_MOB "Current location"
#define WHERE_SUPPLY_BELOW_MOB "Current location (droppod)"
#define WHERE_MOB_HAND "In own mob's hand"
#define WHERE_MARKED_OBJECT "At a marked object"
#define WHERE_IN_MARKED_OBJECT "In the marked object"
#define WHERE_TARGETED_LOCATION "Targeted location"
#define WHERE_TARGETED_LOCATION_POD "Targeted location (droppod)"
#define WHERE_TARGETED_MOB_HAND "In targeted mob's hand"
#define OFFSET_ABSOLUTE "Absolute offset"
#define OFFSET_RELATIVE "Relative offset"
/*
Handles spawning an atom. See the call examples for the proper spawn parameters fetching.
*/
/datum/spawnpanel/proc/spawn_atom(list/spawn_params, mob/user)
if(!check_rights_for(user.client, R_SPAWN) || !spawn_params)
return
var/atom/atom_to_spawn = spawn_params["selected_atom"]
if(!atom_to_spawn || (!ispath(atom_to_spawn, /obj) && !ispath(atom_to_spawn, /turf) && !ispath(atom_to_spawn, /mob)))
return
var/amount = clamp(text2num(spawn_params["atom_amount"]), 1, ADMIN_SPAWN_CAP)
var/X = offset["X"] || 0
var/Y = offset["Y"] || 0
var/Z = offset["Z"] || 0
var/atom_dir = text2num(spawn_params["atom_dir"]) || 1
var/atom_name = sanitize(spawn_params["atom_name"])
var/where_target_type = spawn_params["where_target_type"]
var/atom/target = null
if(where_target_type == WHERE_MOB_HAND || where_target_type == WHERE_TARGETED_MOB_HAND)
target = (where_target_type == WHERE_TARGETED_MOB_HAND ? spawn_params["target"] : user)
if(!target)
to_chat(user, span_warning("No target specified."))
return
if(!ismob(target))
to_chat(user, span_warning("The targeted atom is not a mob."))
return
if(!iscarbon(target) && !isrobot(target))
to_chat(user, span_warning("Can only spawn in hand when the target is a carbon mob or a cyborg."))
where_target_type = WHERE_FLOOR_BELOW_MOB
else if(where_target_type == WHERE_MARKED_OBJECT || where_target_type == WHERE_IN_MARKED_OBJECT)
if(!user.client.holder.marked_datum)
to_chat(user, span_warning("You don't have any object marked."))
return
else if(!istype(user.client.holder.marked_datum, /atom))
to_chat(user, span_warning("The object you have marked cannot be used as a target. Target must be of type /atom."))
return
else
target = (where_target_type == WHERE_MARKED_OBJECT ? get_turf(user.client.holder.marked_datum) : user.client.holder.marked_datum)
else if(where_target_type == WHERE_TARGETED_LOCATION || where_target_type == WHERE_TARGETED_LOCATION_POD)
target = spawn_params["target"]
else
switch(spawn_params["offset_type"])
if(OFFSET_ABSOLUTE)
target = locate(X, Y, Z)
if(OFFSET_RELATIVE)
var/turf/relative_turf
var/atom/user_loc = user.loc
if (user_loc)
relative_turf = get_turf(user_loc)
if (!relative_turf)
if(isobserver(user))
var/mob/observer/dead/user_observer = user
relative_turf = get_turf(user_observer.client?.eye) || get_turf(user_observer)
if (!relative_turf)
relative_turf = locate(1, 1, 1)
if (!relative_turf)
to_chat(user, span_warning("Could not determine a valid relative location."))
return
target = locate(relative_turf.x + X, relative_turf.y + Y, relative_turf.z + Z)
if(!target)
return
var/use_droppod = where_target_type == WHERE_SUPPLY_BELOW_MOB || where_target_type == WHERE_TARGETED_LOCATION_POD
var/obj/structure/drop_pod/polite/pod
if(use_droppod)
pod = new(target)
for(var/i in 1 to amount)
if(istype(atom_to_spawn, /turf))
var/turf/original_turf = target
var/turf/created_turf = original_turf.ChangeTurf(atom_to_spawn.type)
if(created_turf && atom_name)
created_turf.name = atom_name
continue
var/atom/created_atom = new atom_to_spawn(use_droppod ? pod : target)
if(QDELETED(created_atom))
return
created_atom.flags |= ADMIN_SPAWNED
if(spawn_params["apply_icon_override"])
if(spawn_params["selected_atom_icon"])
created_atom.icon = file(spawn_params["selected_atom_icon"])
if(spawn_params["selected_atom_icon_state"])
created_atom.icon_state = spawn_params["selected_atom_icon_state"]
if(spawn_params["atom_icon_size"])
if(ismob(created_atom))
var/mob/living/created_mob = created_atom
created_mob.size_multiplier = spawn_params["atom_icon_size"] / 100
if(atom_dir)
created_atom.set_dir(atom_dir)
if(atom_name)
created_atom.name = atom_name
if(ismob(created_atom))
var/mob/created_mob = created_atom
created_mob.real_name = atom_name
if((where_target_type == WHERE_MOB_HAND || where_target_type == WHERE_TARGETED_MOB_HAND) && isliving(target) && isitem(created_atom))
var/mob/living/living_target = target
var/obj/item/created_item = created_atom
living_target.put_in_hands(created_item)
if(isrobot(living_target))
var/mob/living/silicon/robot/target_robot = living_target
if(target_robot.module)
target_robot.module.add_item(created_item, target_robot)
target_robot.activate_module(created_item)
if(pod)
pod.podfall()
log_admin("[key_name(user)] created [amount == 1 ? "an instance" : "[amount] instances"] of [atom_to_spawn.type]")
if(istype(atom_to_spawn, /mob))
message_admins("[key_name_admin(user)] created [amount == 1 ? "an instance" : "[amount] instances"] of [atom_to_spawn.type]")
#undef WHERE_FLOOR_BELOW_MOB
#undef WHERE_SUPPLY_BELOW_MOB
#undef WHERE_MOB_HAND
#undef WHERE_MARKED_OBJECT
#undef WHERE_IN_MARKED_OBJECT
#undef WHERE_TARGETED_LOCATION
#undef WHERE_TARGETED_LOCATION_POD
#undef WHERE_TARGETED_MOB_HAND
#undef OFFSET_ABSOLUTE
#undef OFFSET_RELATIVE
@@ -0,0 +1,304 @@
#define WHERE_FLOOR_BELOW_MOB "Current location"
#define WHERE_SUPPLY_BELOW_MOB "Current location (droppod)"
#define WHERE_MOB_HAND "In own mob's hand"
#define WHERE_MARKED_OBJECT "At a marked object"
#define WHERE_IN_MARKED_OBJECT "In the marked object"
#define WHERE_TARGETED_LOCATION "Targeted location"
#define WHERE_TARGETED_LOCATION_POD "Targeted location (droppod)"
#define WHERE_TARGETED_MOB_HAND "In targeted mob's hand"
#define PRECISE_MODE_OFF "Off"
#define PRECISE_MODE_TARGET "Target"
#define PRECISE_MODE_MARK "Mark"
#define PRECISE_MODE_COPY "Copy"
#define OFFSET_ABSOLUTE "Absolute offset"
#define OFFSET_RELATIVE "Relative offset"
/*
An instance of a /tg/UI™ Spawn Panel. Stores preferences, spawns things, controls the UI. Unique for each user (their ckey).
*/
/datum/spawnpanel
/// Where and how the atom should be spawned.
var/where_target_type = WHERE_FLOOR_BELOW_MOB
/// The atom selected from the panel.
var/atom/selected_atom = null
/// The icon selected for the atom from the panel.
var/selected_atom_icon = null
/// The icon state selected for the atom from the panel.
var/selected_atom_icon_state = null
/// Should selected icon/icon state override the initial ones? Added as an edge case to not replace animated GAGS icons.
var/apply_icon_override = FALSE
/// A list of icon states to display in preview panels.
var/list/available_icon_states = null
/// Override for the icon size of the spawned mob.
var/atom_icon_size = 100
/// How many atoms will be spawned at once.
var/atom_amount = 1
/// Custom atom name (leave `null` for initial).
var/atom_name = null
/// Custom atom description (leave `null` for initial).
var/atom_desc = null
/// Custom atom dir (leave `null` for `2`).
var/atom_dir = 1
/// An associative list of x-y-z offsets.
var/offset = list()
/// The pivot point for offsetting — relative or absolute.
var/offset_type = OFFSET_RELATIVE
/// Precise mode toggle. Used for build-mode-like spawning experience and targeting datums.
var/precise_mode = PRECISE_MODE_OFF
/datum/spawnpanel/New()
. = ..()
offset = list("X" = 0, "Y" = 0, "Z" = 0)
/datum/spawnpanel/tgui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "SpawnPanel")
ui.open()
/datum/spawnpanel/tgui_close(mob/user)
. = ..()
if (precise_mode && precise_mode != PRECISE_MODE_OFF)
toggle_precise_mode(PRECISE_MODE_OFF, user)
/datum/spawnpanel/tgui_state(mob/user)
return ADMIN_STATE(R_SPAWN)
/datum/spawnpanel/tgui_act(action, params, datum/tgui/ui)
if(..() || !check_rights_for(ui.user.client, R_SPAWN))
return FALSE
switch(action)
if("select-new-DMI")
var/icon/new_icon = input("Select a new icon file:", "Icon") as null|icon
if(new_icon)
selected_atom_icon = new_icon
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]
return TRUE
if("set-apply-icon-override")
apply_icon_override = !!params["value"]
return TRUE
if("reset-DMI-icon")
selected_atom_icon = null
selected_atom_icon_state = null
if(selected_atom)
selected_atom_icon = initial(selected_atom.icon)
selected_atom_icon_state = initial(selected_atom.icon_state)
available_icon_states = icon_states(selected_atom_icon)
else
available_icon_states = list()
return TRUE
if("select-new-icon-state")
selected_atom_icon_state = params["new_state"]
return TRUE
if("reset-icon-state")
selected_atom_icon_state = null
if(selected_atom)
selected_atom_icon_state = initial(selected_atom.icon_state)
return TRUE
if("set-icon-size")
atom_icon_size = params["size"]
return TRUE
if("reset-icon-size")
atom_icon_size = 100
return TRUE
if("get-icon-states")
available_icon_states = icon_states(selected_atom_icon)
return TRUE
if("selected-atom-changed")
var/path = text2path(params["newObj"])
if(path)
var/atom/temp_atom = path
selected_atom_icon = initial(temp_atom.icon)
selected_atom_icon_state = initial(temp_atom.icon_state)
available_icon_states = icon_states(selected_atom_icon)
selected_atom = temp_atom
return TRUE
if("create-atom-action")
var/list/spawn_params = list(
"selected_atom" = selected_atom,
"offset" = params["offset"],
"atom_dir" = text2num(params["dir"]) || 1,
"atom_amount" = text2num(params["atom_amount"]) || 1,
"atom_name" = params["atom_name"],
"where_target_type" = params["where_target_type"] || WHERE_FLOOR_BELOW_MOB,
"atom_icon_size" = params["atom_icon_size"],
"offset_type" = params["offset_type"] || OFFSET_RELATIVE,
"apply_icon_override" = apply_icon_override,
)
if(apply_icon_override)
spawn_params["selected_atom_icon"] = selected_atom_icon
spawn_params["selected_atom_icon_state"] = selected_atom_icon_state
spawn_atom(spawn_params, ui.user)
return TRUE
if("toggle-precise-mode")
var/precise_type = params["newPreciseType"]
if(precise_type == PRECISE_MODE_TARGET && params["where_target_type"])
where_target_type = params["where_target_type"]
toggle_precise_mode(precise_type, ui.user)
return TRUE
if("update-settings")
if(params["atom_amount"])
atom_amount = text2num(params["atom_amount"])
if(params["atom_dir"])
atom_dir = text2num(params["atom_dir"])
if(params["offset"])
var/list/temp_offset = params["offset"]
offset["X"] = temp_offset[1]
offset["Y"] = temp_offset[2]
offset["Z"] = temp_offset[3]
if(params["atom_name"])
atom_name = params["atom_name"]
if(params["where_target_type"])
where_target_type = params["where_target_type"]
if(params["offset_type"])
offset_type = params["offset_type"]
if(params["atom_icon_size"])
atom_icon_size = text2num(params["atom_icon_size"])
if(params["selected_atom_icon"])
selected_atom_icon = params["selected_atom_icon"]
if(params["selected_atom_icon_state"])
selected_atom_icon_state = params["selected_atom_icon_state"]
return TRUE
/datum/spawnpanel/proc/toggle_precise_mode(precise_type, mob/user)
precise_mode = precise_type
var/client/admin_client = user.client
if (!admin_client)
return
/* Unimplemented
admin_client.mouse_up_icon = null
admin_client.mouse_down_icon = null
admin_client.mouse_override_icon = null
*/
admin_client.click_intercept = null
if (precise_mode != PRECISE_MODE_OFF)
/* Unimplemented
admin_client.mouse_up_icon = 'icons/effects/mouse_pointers/supplypod_pickturf.dmi'
admin_client.mouse_down_icon = 'icons/effects/mouse_pointers/supplypod_pickturf_down.dmi'
admin_client.mouse_override_icon = admin_client.mouse_up_icon
admin_client.mouse_pointer_icon = admin_client.mouse_override_icon
*/
admin_client.click_intercept = src
winset(admin_client, "mapwindow.map", "right-click=true")
else
winset(admin_client, "mapwindow.map", "right-click=false")
/* Unimplemented
var/mob/holder_mob = admin_client.mob
holder_mob?.update_mouse_pointer()
*/
/datum/spawnpanel/proc/InterceptClickOn(mob/user, params, atom/target)
var/list/modifiers = params2list(params)
var/left_click = LAZYACCESS(modifiers, LEFT_CLICK)
var/right_click = LAZYACCESS(modifiers, RIGHT_CLICK)
if(right_click)
toggle_precise_mode(PRECISE_MODE_OFF, user)
SStgui.update_uis(src)
return TRUE
if(left_click)
if(istype(target,/atom/movable/screen))
return FALSE
var/turf/clicked_turf = get_turf(target)
if(!clicked_turf)
return FALSE
switch(precise_mode)
if(PRECISE_MODE_TARGET)
var/list/spawn_params = list(
"selected_atom" = selected_atom,
"atom_amount" = atom_amount,
"offset" = "0,0,0",
"atom_dir" = atom_dir,
"atom_name" = atom_name,
"atom_desc" = atom_desc,
"offset_type" = OFFSET_ABSOLUTE,
"where_target_type" = where_target_type,
"target" = target,
"atom_icon_size" = atom_icon_size,
"apply_icon_override" = apply_icon_override,
)
if(apply_icon_override)
spawn_params["selected_atom_icon"] = selected_atom_icon
spawn_params["selected_atom_icon_state"] = selected_atom_icon_state
if(where_target_type == WHERE_TARGETED_LOCATION || where_target_type == WHERE_TARGETED_LOCATION_POD)
spawn_params["X"] = clicked_turf.x
spawn_params["Y"] = clicked_turf.y
spawn_params["Z"] = clicked_turf.z
spawn_atom(spawn_params, user)
if(PRECISE_MODE_MARK)
var/client/admin_client = user.client
admin_client.mark_datum(target)
to_chat(user, span_notice("Marked object: [icon2html(target, user)] [span_bold("[target]")]"))
toggle_precise_mode(PRECISE_MODE_OFF, user)
SStgui.update_uis(src)
if(PRECISE_MODE_COPY)
to_chat(user, span_notice("Picked object: [icon2html(target, user)] [span_bold("[target]")]"))
selected_atom = target
toggle_precise_mode(PRECISE_MODE_OFF, user)
SStgui.update_uis(src)
return TRUE
/datum/spawnpanel/tgui_data(mob/user)
var/data = list()
data["icon"] = selected_atom_icon
data["iconState"] = selected_atom_icon_state
data["iconSize"] = atom_icon_size
data["apply_icon_override"] = apply_icon_override
var/list/states = list()
if(available_icon_states)
for(var/state in available_icon_states)
states += state
data["iconStates"] = states
data["precise_mode"] = precise_mode
data["selected_object"] = selected_atom ? "[selected_atom.type]" : ""
return data
/datum/spawnpanel/ui_assets(mob/user)
return list(
get_asset_datum(/datum/asset/json/spawnpanel),
)
#undef WHERE_FLOOR_BELOW_MOB
#undef WHERE_SUPPLY_BELOW_MOB
#undef WHERE_MOB_HAND
#undef WHERE_MARKED_OBJECT
#undef WHERE_IN_MARKED_OBJECT
#undef WHERE_TARGETED_LOCATION
#undef WHERE_TARGETED_LOCATION_POD
#undef WHERE_TARGETED_MOB_HAND
#undef PRECISE_MODE_OFF
#undef PRECISE_MODE_TARGET
#undef PRECISE_MODE_MARK
#undef PRECISE_MODE_COPY
#undef OFFSET_ABSOLUTE
#undef OFFSET_RELATIVE
+2 -132
View File
@@ -1534,138 +1534,8 @@
return
SSadmin_verbs.dynamic_invoke_verb(usr.client, /datum/admin_verb/show_traitor_panel, M)
else if(href_list["create_object"])
if(!check_rights(R_SPAWN)) return
return create_object(usr)
else if(href_list["quick_create_object"])
if(!check_rights(R_SPAWN)) return
return quick_create_object(usr)
else if(href_list["create_turf"])
if(!check_rights(R_SPAWN)) return
return create_turf(usr)
else if(href_list["create_mob"])
if(!check_rights(R_SPAWN)) return
return create_mob(usr)
else if(href_list["object_list"]) //this is the laggiest thing ever
if(!check_rights(R_SPAWN)) return
if(!CONFIG_GET(flag/allow_admin_spawning))
to_chat(usr, span_filter_adminlog("Spawning of items is not allowed."))
return
var/atom/loc = usr.loc
var/dirty_paths
if (istext(href_list["object_list"]))
dirty_paths = list(href_list["object_list"])
else if (istype(href_list["object_list"], /list))
dirty_paths = href_list["object_list"]
var/paths = list()
var/removed_paths = list()
for(var/dirty_path in dirty_paths)
var/path = text2path(dirty_path)
if(!path)
removed_paths += dirty_path
continue
else if(!ispath(path, /obj) && !ispath(path, /turf) && !ispath(path, /mob))
removed_paths += dirty_path
continue
else if(ispath(path, /obj/item/gun/energy/pulse_rifle))
if(!check_rights(R_FUN,0))
removed_paths += dirty_path
continue
else if(ispath(path, /obj/item/melee/energy/blade))//Not an item one should be able to spawn./N
if(!check_rights(R_FUN,0))
removed_paths += dirty_path
continue
else if(ispath(path, /obj/effect/bhole))
if(!check_rights(R_FUN,0))
removed_paths += dirty_path
continue
paths += path
if(!paths)
tgui_alert(usr, "The path list you sent is empty")
return
if(length(paths) > 5)
tgui_alert_async(usr, "Select fewer object types, (max 5)")
return
else if(length(removed_paths))
tgui_alert_async(usr, "Removed:\n" + jointext(removed_paths, "\n"))
var/list/offset = splittext(href_list["offset"],",")
var/number = dd_range(1, 100, text2num(href_list["object_count"]))
var/X = offset.len > 0 ? text2num(offset[1]) : 0
var/Y = offset.len > 1 ? text2num(offset[2]) : 0
var/Z = offset.len > 2 ? text2num(offset[3]) : 0
var/tmp_dir = href_list["object_dir"]
var/obj_dir = tmp_dir ? text2num(tmp_dir) : 2
if(!obj_dir || !(obj_dir in list(1,2,4,8,5,6,9,10)))
obj_dir = 2
var/obj_name = sanitize(href_list["object_name"])
var/where = href_list["object_where"]
if (!( where in list("onfloor","inhand","inmarked") ))
where = "onfloor"
if( where == "inhand" )
to_chat(usr, span_filter_adminlog("Support for inhand not available yet. Will spawn on floor."))
where = "onfloor"
if ( where == "inhand" ) //Can only give when human or monkey
if ( !( ishuman(usr) || issmall(usr) ) )
to_chat(usr, span_filter_adminlog("Can only spawn in hand when you're a human or a monkey."))
where = "onfloor"
else if ( usr.get_active_hand() )
to_chat(usr, span_filter_adminlog("Your active hand is full. Spawning on floor."))
where = "onfloor"
if ( where == "inmarked" )
if ( !marked_datum )
to_chat(usr, span_filter_adminlog("You don't have any object marked. Abandoning spawn."))
return
else
if ( !istype(marked_datum,/atom) )
to_chat(usr, span_filter_adminlog("The object you have marked cannot be used as a target. Target must be of type /atom. Abandoning spawn."))
return
var/atom/target //Where the object will be spawned
switch ( where )
if ( "onfloor" )
switch (href_list["offset_type"])
if ("absolute")
target = locate(0 + X,0 + Y,0 + Z)
if ("relative")
target = locate(loc.x + X,loc.y + Y,loc.z + Z)
if ( "inmarked" )
target = marked_datum
if(target)
for (var/path in paths)
for (var/i = 0; i < number; i++)
if(path in typesof(/turf))
var/turf/O = target
var/turf/N = O.ChangeTurf(path)
if(N)
if(obj_name)
N.name = obj_name
else
var/atom/O = new path(target)
if(O)
O.set_dir(obj_dir)
if(obj_name)
O.name = obj_name
if(istype(O,/mob))
var/mob/M = O
M.real_name = obj_name
log_and_message_admins("created [number] [english_list(paths)]")
return
else if(href_list["spawn_panel"])
SSadmin_verbs.dynamic_invoke_verb(usr, /datum/admin_verb/spawn_panel)
//else if(href_list["admin_secrets_panel"])
//var/datum/admin_secret_category/AC = locate(href_list["admin_secrets_panel"]) in admin_secrets.categories
+7
View File
@@ -0,0 +1,7 @@
ADMIN_VERB(spawn_panel, R_SPAWN, "Spawn Panel", "Spawn Panel (TGUI).", ADMIN_CATEGORY_GAME)
var/datum/spawnpanel/panel = user.holder.spawn_panel
if(!panel)
panel = new()
user.holder.spawn_panel = panel
panel.tgui_interact(user.mob)
feedback_add_details("admin_verb","SP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!