mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-26 14:39:58 +01:00
Merge branch 'master' into itriedlookingupwhatpromptedthischangebutsadlythelogswerelostwhentheroundended
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
icon_state = "sleeper"
|
||||
state_open = TRUE
|
||||
anchored = TRUE
|
||||
occupant_typecache = list(/mob/living/carbon/human) // turned into typecache in Initialize
|
||||
var/you_die_in_the_game_you_die_for_real = FALSE
|
||||
var/datum/effect_system/spark_spread/sparks
|
||||
var/mob/living/carbon/human/virtual_reality/vr_human
|
||||
@@ -92,11 +93,12 @@
|
||||
return
|
||||
switch(action)
|
||||
if("vr_connect")
|
||||
if(ishuman(occupant) && occupant.mind)
|
||||
var/mob/living/carbon/human/human_occupant = occupant
|
||||
if(human_occupant && human_occupant.mind)
|
||||
to_chat(occupant, "<span class='warning'>Transfering to virtual reality...</span>")
|
||||
if(vr_human)
|
||||
vr_human.revert_to_reality(FALSE, FALSE)
|
||||
occupant.mind.transfer_to(vr_human)
|
||||
human_occupant.mind.transfer_to(vr_human)
|
||||
vr_human.real_me = occupant
|
||||
to_chat(vr_human, "<span class='notice'>Transfer successful! you are now playing as [vr_human] in VR!</span>")
|
||||
SStgui.close_user_uis(vr_human, src)
|
||||
|
||||
@@ -610,20 +610,41 @@
|
||||
set desc = "(atom path) Spawn an atom"
|
||||
set name = "Spawn"
|
||||
|
||||
return usr.client.spawn_atom_impl(object, FALSE)
|
||||
|
||||
/datum/admins/proc/spawn_atom_adv(object as text)
|
||||
set category = "Debug"
|
||||
set desc = "(atom path) Spawn an atom with New() parameters"
|
||||
set name = "Advanced Spawn"
|
||||
|
||||
return usr.client.spawn_atom_impl(object, TRUE)
|
||||
|
||||
|
||||
/client/proc/spawn_atom_impl(object, params)
|
||||
if(!check_rights(R_SPAWN))
|
||||
return
|
||||
|
||||
var/chosen = pick_closest_path(object)
|
||||
if(!chosen)
|
||||
return
|
||||
|
||||
var/list/arguments
|
||||
if(ispath(chosen,/turf))
|
||||
var/turf/T = get_turf(usr.loc)
|
||||
T.ChangeTurf(chosen)
|
||||
else
|
||||
var/atom/A = new chosen(usr.loc)
|
||||
if(params)
|
||||
arguments = usr.client.get_callproc_args(TRUE)
|
||||
|
||||
if(!usr)
|
||||
return
|
||||
|
||||
arguments = list(usr.loc) + arguments
|
||||
|
||||
var/atom/A = new chosen(arglist(arguments))
|
||||
A.admin_spawned = TRUE
|
||||
|
||||
log_admin("[key_name(usr)] spawned [chosen] at ([usr.x],[usr.y],[usr.z])")
|
||||
log_admin("[key_name(usr)] spawned [chosen] at [COORD(usr)][LAZYLEN(arguments) > 1 ? " with parameters [print_single_line(arguments)]": ""]")
|
||||
SSblackbox.add_details("admin_verb","Spawn Atom") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
|
||||
|
||||
@@ -4,7 +4,8 @@ atom/proc/investigate_log(message, subject)
|
||||
var/F = file("[GLOB.log_directory]/[subject].html")
|
||||
F << "<small>[time_stamp()] \ref[src] ([x],[y],[z])</small> || [src] [message]<br>"
|
||||
|
||||
/client/proc/investigate_show( subject in list("hrefs","notes, memos, watchlist","singulo","wires","telesci", "gravity", "records", "cargo", "supermatter", "atmos", "experimentor", "kudzu") )
|
||||
|
||||
/client/proc/investigate_show( subject in list("hrefs","notes, memos, watchlist","singulo","wires","telesci", "gravity", "records", "cargo", "supermatter", "atmos", "experimentor", "botany") )
|
||||
set name = "Investigate"
|
||||
set category = "Admin"
|
||||
if(!holder)
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
//admin verb groups - They can overlap if you so wish. Only one of each verb will exist in the verbs list regardless
|
||||
//the procs are cause you can't put the comments in the GLOB var define
|
||||
GLOBAL_PROTECT(admin_verbs_default)
|
||||
GLOBAL_LIST_INIT(admin_verbs_default, AVerbsDefault())
|
||||
/proc/AVerbsDefault()
|
||||
GLOBAL_LIST_INIT(admin_verbs_default, world.AVerbsDefault())
|
||||
/world/proc/AVerbsDefault()
|
||||
return list(
|
||||
/client/proc/toggleadminhelpsound, /*toggles whether we hear a sound when adminhelps/PMs are used*/
|
||||
/client/proc/toggleannouncelogin, /*toggles if an admin's login is announced during a round*/
|
||||
@@ -25,8 +26,8 @@ GLOBAL_LIST_INIT(admin_verbs_default, AVerbsDefault())
|
||||
/client/proc/stop_sounds
|
||||
)
|
||||
GLOBAL_PROTECT(admin_verbs_admin)
|
||||
GLOBAL_LIST_INIT(admin_verbs_admin, AVerbsAdmin())
|
||||
/proc/AVerbsAdmin()
|
||||
GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin())
|
||||
/world/proc/AVerbsAdmin()
|
||||
return list(
|
||||
/client/proc/player_panel_new, /*shows an interface for all players, with links to various panels*/
|
||||
/client/proc/invisimin, /*allows our mob to go invisible/visible*/
|
||||
@@ -76,9 +77,7 @@ GLOBAL_LIST_INIT(admin_verbs_ban, list(/client/proc/unban_panel,/client/proc/DB_
|
||||
GLOBAL_PROTECT(admin_verbs_sounds)
|
||||
GLOBAL_LIST_INIT(admin_verbs_sounds, list(/client/proc/play_local_sound,/client/proc/play_sound,/client/proc/set_round_end_sound))
|
||||
GLOBAL_PROTECT(admin_verbs_fun)
|
||||
GLOBAL_LIST_INIT(admin_verbs_fun, AVerbsFun())
|
||||
/proc/AVerbsFun()
|
||||
return list(
|
||||
GLOBAL_LIST_INIT(admin_verbs_fun, list(
|
||||
/client/proc/cmd_admin_dress,
|
||||
/client/proc/cmd_admin_gib_self,
|
||||
/client/proc/drop_bomb,
|
||||
@@ -100,12 +99,12 @@ GLOBAL_LIST_INIT(admin_verbs_fun, AVerbsFun())
|
||||
/client/proc/polymorph_all,
|
||||
/client/proc/show_tip,
|
||||
/client/proc/smite
|
||||
)
|
||||
))
|
||||
GLOBAL_PROTECT(admin_verbs_spawn)
|
||||
GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom,/client/proc/respawn_character))
|
||||
GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom,/datum/admins/proc/spawn_atom_adv,/client/proc/respawn_character))
|
||||
GLOBAL_PROTECT(admin_verbs_server)
|
||||
GLOBAL_LIST_INIT(admin_verbs_server, AVerbsServer())
|
||||
/proc/AVerbsServer()
|
||||
GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer())
|
||||
/world/proc/AVerbsServer()
|
||||
return list(
|
||||
/datum/admins/proc/startnow,
|
||||
/datum/admins/proc/restart,
|
||||
@@ -123,8 +122,8 @@ GLOBAL_LIST_INIT(admin_verbs_server, AVerbsServer())
|
||||
/client/proc/toggle_hub
|
||||
)
|
||||
GLOBAL_PROTECT(admin_verbs_debug)
|
||||
GLOBAL_LIST_INIT(admin_verbs_debug, AVerbsDebug())
|
||||
/proc/AVerbsDebug()
|
||||
GLOBAL_LIST_INIT(admin_verbs_debug, world.AVerbsDebug())
|
||||
/world/proc/AVerbsDebug()
|
||||
return list(
|
||||
/client/proc/restart_controller,
|
||||
/client/proc/cmd_admin_list_open_jobs,
|
||||
@@ -169,9 +168,7 @@ GLOBAL_LIST_INIT(admin_verbs_rejuv, list(/client/proc/respawn_character))
|
||||
|
||||
//verbs which can be hidden - needs work
|
||||
GLOBAL_PROTECT(admin_verbs_hideable)
|
||||
GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable())
|
||||
/proc/AVerbsHideable()
|
||||
return list(
|
||||
GLOBAL_LIST_INIT(admin_verbs_hideable, list(
|
||||
/client/proc/set_ooc,
|
||||
/client/proc/reset_ooc,
|
||||
/client/proc/deadmin,
|
||||
@@ -240,7 +237,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable())
|
||||
/client/proc/debug_huds,
|
||||
/client/proc/customiseSNPC,
|
||||
/client/proc/resetSNPC,
|
||||
)
|
||||
))
|
||||
|
||||
/client/proc/add_admin_verbs()
|
||||
if(holder)
|
||||
|
||||
@@ -238,7 +238,7 @@
|
||||
if("showgm")
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
if(!SSticker || !SSticker.mode)
|
||||
if(!SSticker.HasRoundStarted())
|
||||
alert("The game hasn't started yet!")
|
||||
else if (SSticker.mode)
|
||||
alert("The game mode is [SSticker.mode.name]")
|
||||
@@ -327,7 +327,7 @@
|
||||
if("traitor_all")
|
||||
if(!check_rights(R_FUN))
|
||||
return
|
||||
if(!SSticker || !SSticker.mode)
|
||||
if(!SSticker.HasRoundStarted())
|
||||
alert("The game hasn't started yet!")
|
||||
return
|
||||
var/objective = copytext(sanitize(input("Enter an objective")),1,MAX_MESSAGE_LEN)
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
if(href_list["ahelp"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
|
||||
var/ahelp_ref = href_list["ahelp"]
|
||||
var/datum/admin_help/AH = locate(ahelp_ref)
|
||||
if(AH)
|
||||
@@ -1170,7 +1170,7 @@
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
if(SSticker && SSticker.mode)
|
||||
if(SSticker.HasRoundStarted())
|
||||
return alert(usr, "The game has already started.", null, null, null, null)
|
||||
var/dat = {"<B>What mode do you wish to play?</B><HR>"}
|
||||
for(var/mode in config.modes)
|
||||
@@ -1184,7 +1184,7 @@
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
if(SSticker && SSticker.mode)
|
||||
if(SSticker.HasRoundStarted())
|
||||
return alert(usr, "The game has already started.", null, null, null, null)
|
||||
if(GLOB.master_mode != "secret")
|
||||
return alert(usr, "The game mode has to be secret!", null, null, null, null)
|
||||
@@ -1199,7 +1199,7 @@
|
||||
if(!check_rights(R_ADMIN|R_SERVER))
|
||||
return
|
||||
|
||||
if (SSticker && SSticker.mode)
|
||||
if (SSticker.HasRoundStarted())
|
||||
return alert(usr, "The game has already started.", null, null, null, null)
|
||||
GLOB.master_mode = href_list["c_mode2"]
|
||||
log_admin("[key_name(usr)] set the mode as [GLOB.master_mode].")
|
||||
@@ -1213,7 +1213,7 @@
|
||||
if(!check_rights(R_ADMIN|R_SERVER))
|
||||
return
|
||||
|
||||
if(SSticker && SSticker.mode)
|
||||
if(SSticker.HasRoundStarted())
|
||||
return alert(usr, "The game has already started.", null, null, null, null)
|
||||
if(GLOB.master_mode != "secret")
|
||||
return alert(usr, "The game mode has to be secret!", null, null, null, null)
|
||||
@@ -1810,7 +1810,7 @@
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
if(!SSticker || !SSticker.mode)
|
||||
if(!SSticker.HasRoundStarted())
|
||||
alert("The game hasn't started yet!")
|
||||
return
|
||||
|
||||
|
||||
@@ -251,6 +251,11 @@
|
||||
|
||||
/proc/SDQL_from_objs(list/tree)
|
||||
if("world" in tree)
|
||||
if(IsAdminAdvancedProcCall())
|
||||
var/msg = "WARNING: Attempt to retrieve world reference made by [usr]!"
|
||||
log_admin(msg)
|
||||
message_admins(msg)
|
||||
return
|
||||
return world
|
||||
return SDQL_expression(world, tree)
|
||||
|
||||
@@ -451,12 +456,17 @@
|
||||
else
|
||||
return null
|
||||
if("world")
|
||||
if(IsAdminAdvancedProcCall())
|
||||
var/msg = "WARNING: Attempt to retrieve world reference made by [usr]!"
|
||||
log_admin(msg)
|
||||
message_admins(msg)
|
||||
return
|
||||
v = world
|
||||
if("global")
|
||||
v = GLOB
|
||||
else
|
||||
return null
|
||||
else if(object == world) // Shitty ass hack kill me.
|
||||
else if(object == GLOB) // Shitty ass hack kill me.
|
||||
v = expression[start]
|
||||
if(long)
|
||||
if(expression[start + 1] == ".")
|
||||
@@ -477,7 +487,7 @@
|
||||
var/list/new_args = list()
|
||||
for(var/arg in arguments)
|
||||
new_args += SDQL_expression(source, arg)
|
||||
if(object == world) // Global proc.
|
||||
if(object == GLOB) // Global proc.
|
||||
procname = "/proc/[procname]"
|
||||
return WrapAdminProcCall(GLOBAL_PROC, procname, new_args)
|
||||
return WrapAdminProcCall(object, procname, new_args)
|
||||
|
||||
@@ -67,7 +67,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
for(var/I in l2b)
|
||||
var/datum/admin_help/AH = I
|
||||
dat += "<span class='adminnotice'><span class='adminhelp'>Ticket #[AH.id]</span>: <A HREF='?_src_=holder;ahelp=\ref[AH];ahelp_action=ticket'>[AH.initiator_key_name]: [AH.name]</A></span><br>"
|
||||
|
||||
|
||||
usr << browse(dat.Join(), "window=ahelp_list[state];size=600x480")
|
||||
|
||||
//Tickets statpanel
|
||||
@@ -253,7 +253,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
if(state == AHELP_ACTIVE)
|
||||
to_chat(usr, "<span class='warning'>This ticket is already open.</span>")
|
||||
return
|
||||
|
||||
|
||||
if(GLOB.ahelp_tickets.CKey2ActiveTicket(initiator_ckey))
|
||||
to_chat(usr, "<span class='warning'>This user already has an active ticket, cannot reopen this one.</span>")
|
||||
return
|
||||
@@ -310,7 +310,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
RemoveActive()
|
||||
state = AHELP_RESOLVED
|
||||
GLOB.ahelp_tickets.ListInsert(src)
|
||||
|
||||
|
||||
if(initiator)
|
||||
initiator.giveadminhelpverb()
|
||||
|
||||
@@ -325,7 +325,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
/datum/admin_help/proc/Reject(key_name = key_name_admin(usr))
|
||||
if(state != AHELP_ACTIVE)
|
||||
return
|
||||
|
||||
|
||||
if(initiator)
|
||||
initiator.giveadminhelpverb()
|
||||
|
||||
@@ -479,7 +479,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
current_ticket.MessageNoRecipient(msg)
|
||||
current_ticket.TimeoutVerb()
|
||||
return
|
||||
else
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Ticket not found, creating new one...</span>")
|
||||
else
|
||||
current_ticket.AddInteraction("[key_name_admin(usr)] opened a new ticket.")
|
||||
@@ -494,7 +494,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
|
||||
if(!check_rights(R_ADMIN, TRUE))
|
||||
return
|
||||
|
||||
|
||||
var/browse_to
|
||||
|
||||
switch(input("Display which ticket list?") as null|anything in list("Active Tickets", "Closed Tickets", "Resolved Tickets"))
|
||||
@@ -506,7 +506,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
browse_to = AHELP_RESOLVED
|
||||
else
|
||||
return
|
||||
|
||||
|
||||
GLOB.ahelp_tickets.BrowseTickets(browse_to)
|
||||
|
||||
//
|
||||
@@ -591,7 +591,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
admin_keys += "[C][C.holder.fakekey ? "(Stealth)" : ""][C.is_afk() ? "(AFK)" : ""]"
|
||||
|
||||
for(var/admin in admin_keys)
|
||||
if(LAZYLEN(admin_keys) > 1)
|
||||
if(LAZYLEN(message) > 1)
|
||||
message += ", [admin]"
|
||||
else
|
||||
message += "[admin]"
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
|
||||
if (!msg)
|
||||
return
|
||||
var/nicknames = world.file2list("config/admin_nicknames.txt")
|
||||
var/static/nicknames = world.file2list("config/admin_nicknames.txt")
|
||||
|
||||
var/rendered = "<span class='game deadsay'><span class='prefix'>DEAD:</span> <span class='name'>ADMIN([src.holder.fakekey ? pick(nicknames) : src.key])</span> says, <span class='message'>\"[msg]\"</span></span>"
|
||||
|
||||
@@ -29,4 +29,4 @@
|
||||
if (M.stat == DEAD || (M.client && M.client.holder && (M.client.prefs.chat_toggles & CHAT_DEAD))) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above
|
||||
M.show_message(rendered, 2)
|
||||
|
||||
SSblackbox.add_details("admin_verb","Dsay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
SSblackbox.add_details("admin_verb","Dsay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
@@ -145,8 +145,8 @@ GLOBAL_PROTECT(AdminProcCallCount)
|
||||
|
||||
|
||||
|
||||
/client/proc/get_callproc_args()
|
||||
var/argnum = input("Number of arguments","Number:",0) as num|null
|
||||
/client/proc/get_callproc_args(is_atom_new = FALSE)
|
||||
var/argnum = input("Number of arguments[is_atom_new ? " (Excluding loc)" : ""]","Number:",0) as num|null
|
||||
if(isnull(argnum))
|
||||
return
|
||||
|
||||
@@ -213,7 +213,7 @@ GLOBAL_PROTECT(AdminProcCallCount)
|
||||
set category = "Fun"
|
||||
set name = "Make Robot"
|
||||
|
||||
if(!SSticker || !SSticker.mode)
|
||||
if(!SSticker.HasRoundStarted())
|
||||
alert("Wait until the game starts")
|
||||
return
|
||||
if(ishuman(M))
|
||||
@@ -229,7 +229,7 @@ GLOBAL_PROTECT(AdminProcCallCount)
|
||||
set category = "Fun"
|
||||
set name = "Make Blob"
|
||||
|
||||
if(!SSticker || !SSticker.mode)
|
||||
if(!SSticker.HasRoundStarted())
|
||||
alert("Wait until the game starts")
|
||||
return
|
||||
if(ishuman(M))
|
||||
@@ -247,7 +247,7 @@ GLOBAL_PROTECT(AdminProcCallCount)
|
||||
set category = "Fun"
|
||||
set name = "Make Simple Animal"
|
||||
|
||||
if(!SSticker || !SSticker.mode)
|
||||
if(!SSticker.HasRoundStarted())
|
||||
alert("Wait until the game starts")
|
||||
return
|
||||
|
||||
@@ -295,7 +295,7 @@ GLOBAL_PROTECT(AdminProcCallCount)
|
||||
set category = "Fun"
|
||||
set name = "Make Alien"
|
||||
|
||||
if(!SSticker || !SSticker.mode)
|
||||
if(!SSticker.HasRoundStarted())
|
||||
alert("Wait until the game starts")
|
||||
return
|
||||
if(ishuman(M))
|
||||
@@ -312,7 +312,7 @@ GLOBAL_PROTECT(AdminProcCallCount)
|
||||
set category = "Fun"
|
||||
set name = "Make slime"
|
||||
|
||||
if(!SSticker || !SSticker.mode)
|
||||
if(!SSticker.HasRoundStarted())
|
||||
alert("Wait until the game starts")
|
||||
return
|
||||
if(ishuman(M))
|
||||
@@ -423,7 +423,7 @@ GLOBAL_PROTECT(AdminProcCallCount)
|
||||
set category = "Admin"
|
||||
set name = "Grant Full Access"
|
||||
|
||||
if(!SSticker || !SSticker.mode)
|
||||
if(!SSticker.HasRoundStarted())
|
||||
alert("Wait until the game starts")
|
||||
return
|
||||
if(ishuman(M))
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
usr.client.images += preview
|
||||
if(alert(usr,"Confirm location.","Template Confirm","Yes","No") == "Yes")
|
||||
if(template.load(T, centered = TRUE))
|
||||
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has placed a map template ([template.name]) at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>(JMP)</a></span>")
|
||||
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has placed a map template ([template.name]) at [ADMIN_COORDJMP(T)]</span>")
|
||||
else
|
||||
to_chat(usr, "Failed to place map")
|
||||
usr.client.images -= preview
|
||||
|
||||
@@ -41,7 +41,7 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list(
|
||||
/client/proc/disable_communication,
|
||||
/client/proc/print_pointers,
|
||||
/client/proc/cmd_show_at_list,
|
||||
/client/proc/cmd_show_at_list,
|
||||
/client/proc/cmd_show_at_markers,
|
||||
/client/proc/manipulate_organs
|
||||
))
|
||||
|
||||
@@ -154,14 +154,35 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list(
|
||||
var/dat = {"<b>Coordinate list of Active Turfs at Roundstart</b>
|
||||
<br>Real-time Active Turfs list you can see in Air Subsystem at active_turfs var<br>"}
|
||||
|
||||
for(var/i=1; i<=GLOB.active_turfs_startlist.len; i++)
|
||||
dat += GLOB.active_turfs_startlist[i]
|
||||
for(var/t in GLOB.active_turfs_startlist)
|
||||
var/turf/T = t
|
||||
dat += "[ADMIN_COORDJMP(T)]\n"
|
||||
dat += "<br>"
|
||||
|
||||
usr << browse(dat, "window=at_list")
|
||||
|
||||
SSblackbox.add_details("admin_verb","Show Roundstart Active Turfs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/cmd_show_at_markers()
|
||||
set category = "Mapping"
|
||||
set name = "Show roundstart AT markers"
|
||||
set desc = "Places a marker on all active-at-roundstart turfs"
|
||||
|
||||
var/count = 0
|
||||
for(var/obj/effect/abstract/marker/at/AT in GLOB.all_abstract_markers)
|
||||
qdel(AT)
|
||||
count++
|
||||
|
||||
if(count)
|
||||
to_chat(usr, "[count] AT markers removed.")
|
||||
else
|
||||
for(var/t in GLOB.active_turfs_startlist)
|
||||
new /obj/effect/abstract/marker/at(t)
|
||||
count++
|
||||
to_chat(usr, "[count] AT markers placed.")
|
||||
|
||||
SSblackbox.add_details("admin_verb","Show Roundstart Active Turf Markers")
|
||||
|
||||
/client/proc/enable_debug_verbs()
|
||||
set category = "Debug"
|
||||
set name = "Debug verbs - Enable"
|
||||
|
||||
@@ -213,7 +213,14 @@ GLOBAL_PROTECT(VVpixelmovement)
|
||||
.["class"] = null
|
||||
return
|
||||
.["type"] = type
|
||||
.["value"] = new type()
|
||||
|
||||
var/list/arguments
|
||||
if(alert(usr, "Would you like to add arguments?", "New Atom", "No", "Yes") == "Yes")
|
||||
arguments = get_callproc_args(FALSE)
|
||||
else
|
||||
arguments = list()
|
||||
|
||||
.["value"] = new type(arglist(arguments))
|
||||
|
||||
if (VV_NEW_DATUM)
|
||||
var/type = pick_closest_path(FALSE, get_fancy_list_of_datum_types())
|
||||
@@ -221,7 +228,13 @@ GLOBAL_PROTECT(VVpixelmovement)
|
||||
.["class"] = null
|
||||
return
|
||||
.["type"] = type
|
||||
.["value"] = new type()
|
||||
var/list/arguments
|
||||
if(alert(usr, "Would you like to add arguments?", "New Atom", "No", "Yes") == "Yes")
|
||||
arguments = get_callproc_args(FALSE)
|
||||
else
|
||||
arguments = list()
|
||||
|
||||
.["value"] = new type(arglist(arguments))
|
||||
|
||||
if (VV_NEW_TYPE)
|
||||
var/type = current_value
|
||||
@@ -237,7 +250,14 @@ GLOBAL_PROTECT(VVpixelmovement)
|
||||
.["class"] = null
|
||||
return
|
||||
.["type"] = type
|
||||
.["value"] = new type()
|
||||
|
||||
var/list/arguments
|
||||
if(alert(usr, "Would you like to add arguments?", "New Atom", "No", "Yes") == "Yes")
|
||||
arguments = get_callproc_args(FALSE);
|
||||
else
|
||||
arguments = list()
|
||||
|
||||
.["value"] = new type(arglist(arguments))
|
||||
|
||||
|
||||
if (VV_NEW_LIST)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
GLOBAL_VAR_INIT(highlander, FALSE)
|
||||
/client/proc/only_one() //Gives everyone kilts, berets, claymores, and pinpointers, with the objective to hijack the emergency shuttle.
|
||||
if(!SSticker || !SSticker.mode)
|
||||
if(!SSticker.HasRoundStarted())
|
||||
alert("The game hasn't started yet!")
|
||||
return
|
||||
GLOB.highlander = TRUE
|
||||
@@ -79,7 +79,7 @@ GLOBAL_VAR_INIT(highlander, FALSE)
|
||||
Activate it in your hand, and it will lead to the nearest target. Attack the nuclear authentication disk with it, and you will store it.</span>")
|
||||
|
||||
/proc/only_me()
|
||||
if(!SSticker || !SSticker.mode)
|
||||
if(!SSticker.HasRoundStarted())
|
||||
alert("The game hasn't started yet!")
|
||||
return
|
||||
|
||||
|
||||
@@ -4,9 +4,6 @@
|
||||
if(!check_rights(R_SOUNDS))
|
||||
return
|
||||
|
||||
log_admin("[key_name(src)] played sound [S]")
|
||||
message_admins("[key_name_admin(src)] played sound [S]")
|
||||
|
||||
var/freq = 1
|
||||
if(SSevents.holidays && SSevents.holidays[APRIL_FOOLS])
|
||||
freq = pick(0.5, 0.7, 0.8, 0.85, 0.9, 0.95, 1.1, 1.2, 1.4, 1.6, 2.0, 2.5)
|
||||
@@ -20,6 +17,16 @@
|
||||
admin_sound.wait = 1
|
||||
admin_sound.repeat = 0
|
||||
admin_sound.status = SOUND_STREAM
|
||||
|
||||
var/res = alert(usr, "Show the title of this song to the players?",, "No", "Yes", "Cancel")
|
||||
switch(res)
|
||||
if("Yes")
|
||||
to_chat(world, "<span class='boldannounce'>An admin played: [S]</span>")
|
||||
if("Cancel")
|
||||
return
|
||||
|
||||
log_admin("[key_name(src)] played sound [S]")
|
||||
message_admins("[key_name_admin(src)] played sound [S]")
|
||||
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
if(M.client.prefs.toggles & SOUND_MIDI)
|
||||
|
||||
@@ -108,8 +108,8 @@
|
||||
for(var/mob/M in view(range,A))
|
||||
to_chat(M, msg)
|
||||
|
||||
log_admin("LocalNarrate: [key_name(usr)] at ([get_area(A)]): [msg]")
|
||||
message_admins("<span class='adminnotice'><b> LocalNarrate: [key_name_admin(usr)] at (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[A.x];Y=[A.y];Z=[A.z]'>[get_area(A)]</a>):</b> [msg]<BR></span>")
|
||||
log_admin("LocalNarrate: [key_name(usr)] at [get_area(A)][COORD(A)]: [msg]")
|
||||
message_admins("<span class='adminnotice'><b> LocalNarrate: [key_name_admin(usr)] at [get_area(A)][ADMIN_JMP(A)]:</b> [msg]<BR></span>")
|
||||
SSblackbox.add_details("admin_verb","Local Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/cmd_admin_godmode(mob/M in GLOB.mob_list)
|
||||
@@ -505,7 +505,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
message_admins("[key_name_admin(src)] has changed Central Command's name to [input]")
|
||||
log_admin("[key_name(src)] has changed the Central Command name to: [input]")
|
||||
|
||||
/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in world)
|
||||
/client/proc/cmd_admin_delete(atom/A as obj|mob|turf in world)
|
||||
set category = "Admin"
|
||||
set name = "Delete"
|
||||
|
||||
@@ -513,15 +513,20 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
to_chat(src, "Only administrators may use this command.")
|
||||
return
|
||||
|
||||
if (alert(src, "Are you sure you want to delete:\n[O]\nat ([O.x], [O.y], [O.z])?", "Confirmation", "Yes", "No") == "Yes")
|
||||
log_admin("[key_name(usr)] deleted [O] at ([O.x],[O.y],[O.z])")
|
||||
message_admins("[key_name_admin(usr)] deleted [O] at ([O.x],[O.y],[O.z])")
|
||||
admin_delete(A)
|
||||
|
||||
/client/proc/admin_delete(datum/D)
|
||||
var/atom/A = D
|
||||
var/coords = istype(A) ? " at ([A.x], [A.y], [A.z])" : ""
|
||||
if (alert(src, "Are you sure you want to delete:\n[D]\nat[coords]?", "Confirmation", "Yes", "No") == "Yes")
|
||||
log_admin("[key_name(usr)] deleted [D][coords]")
|
||||
message_admins("[key_name_admin(usr)] deleted [D][coords]")
|
||||
SSblackbox.add_details("admin_verb","Delete") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
if(isturf(O))
|
||||
var/turf/T = O
|
||||
if(isturf(D))
|
||||
var/turf/T = D
|
||||
T.ChangeTurf(T.baseturf)
|
||||
else
|
||||
qdel(O)
|
||||
qdel(D)
|
||||
|
||||
/client/proc/cmd_admin_list_open_jobs()
|
||||
set category = "Admin"
|
||||
@@ -696,7 +701,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
set name = "Make Everyone Random"
|
||||
set desc = "Make everyone have a random appearance. You can only use this before rounds!"
|
||||
|
||||
if(SSticker && SSticker.mode)
|
||||
if(SSticker.HasRoundStarted())
|
||||
to_chat(usr, "Nope you can't do this, the game's already started. This only works before rounds!")
|
||||
return
|
||||
|
||||
|
||||
@@ -93,10 +93,10 @@
|
||||
if(href_list["time"])
|
||||
timing = text2num(href_list["time"])
|
||||
if(timing && istype(holder, /obj/item/device/transfer_valve))
|
||||
var/timer_message = "[key_name_admin(usr)](<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) activated [src] attachment on [holder]."
|
||||
var/timer_message = "[ADMIN_LOOKUPFLW(usr)] activated [src] attachment on [holder]."
|
||||
message_admins(timer_message)
|
||||
GLOB.bombers += timer_message
|
||||
log_game("[key_name(usr)] activated [src] attachment for [loc]")
|
||||
log_game("[key_name(usr)] activated [src] attachment on [holder]")
|
||||
update_icon()
|
||||
if(href_list["repeat"])
|
||||
loop = text2num(href_list["repeat"])
|
||||
|
||||
@@ -64,6 +64,8 @@
|
||||
setDir(pick(GLOB.cardinal))
|
||||
air_update_turf()
|
||||
|
||||
/obj/effect/hotspot/make_frozen_visual()
|
||||
return //you take my fun i take yours
|
||||
|
||||
/obj/effect/hotspot/proc/perform_exposure()
|
||||
var/turf/open/location = loc
|
||||
|
||||
@@ -662,7 +662,7 @@
|
||||
playsound(src.loc, W.usesound, 50, 1)
|
||||
if (do_after(user, 20*W.toolspeed, target = src))
|
||||
if (buildstage == 1)
|
||||
user <<"<span class='notice'>You remove the air alarm electronics.</span>"
|
||||
to_chat(user, "<span class='notice'>You remove the air alarm electronics.</span>")
|
||||
new /obj/item/weapon/electronics/airalarm( src.loc )
|
||||
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
buildstage = 0
|
||||
|
||||
@@ -111,7 +111,8 @@
|
||||
var/datum/gas_mixture/air1 = AIR1
|
||||
var/turf/T = get_turf(src)
|
||||
if(occupant)
|
||||
if(occupant.health >= 100) // Don't bother with fully healed people.
|
||||
var/mob/living/mob_occupant = occupant
|
||||
if(mob_occupant.health >= 100) // Don't bother with fully healed people.
|
||||
on = FALSE
|
||||
update_icon()
|
||||
playsound(T, 'sound/machines/cryo_warning.ogg', volume) // Bug the doctors.
|
||||
@@ -120,15 +121,15 @@
|
||||
radio.talk_into(src, "Auto ejecting patient now", radio_channel, get_spans(), get_default_language())
|
||||
open_machine()
|
||||
return
|
||||
else if(occupant.stat == DEAD) // We don't bother with dead people.
|
||||
else if(mob_occupant.stat == DEAD) // We don't bother with dead people.
|
||||
return
|
||||
if(autoeject) // Eject if configured.
|
||||
open_machine()
|
||||
return
|
||||
if(air1.gases.len)
|
||||
if(occupant.bodytemperature < T0C) // Sleepytime. Why? More cryo magic.
|
||||
occupant.Sleeping((occupant.bodytemperature / sleep_factor) * 100)
|
||||
occupant.Paralyse((occupant.bodytemperature / paralyze_factor) * 100)
|
||||
if(mob_occupant.bodytemperature < T0C) // Sleepytime. Why? More cryo magic.
|
||||
mob_occupant.Sleeping((mob_occupant.bodytemperature / sleep_factor) * 100)
|
||||
mob_occupant.Paralyse((mob_occupant.bodytemperature / paralyze_factor) * 100)
|
||||
|
||||
if(beaker)
|
||||
if(reagent_transfer == 0) // Magically transfer reagents. Because cryo magic.
|
||||
@@ -149,19 +150,20 @@
|
||||
update_icon()
|
||||
return
|
||||
if(occupant)
|
||||
var/mob/living/mob_occupant = occupant
|
||||
var/cold_protection = 0
|
||||
var/mob/living/carbon/human/H = occupant
|
||||
if(istype(H))
|
||||
cold_protection = H.get_cold_protection(air1.temperature)
|
||||
|
||||
var/temperature_delta = air1.temperature - occupant.bodytemperature // The only semi-realistic thing here: share temperature between the cell and the occupant.
|
||||
var/temperature_delta = air1.temperature - mob_occupant.bodytemperature // The only semi-realistic thing here: share temperature between the cell and the occupant.
|
||||
if(abs(temperature_delta) > 1)
|
||||
var/air_heat_capacity = air1.heat_capacity()
|
||||
var/heat = ((1 - cold_protection) / 10 + conduction_coefficient) \
|
||||
* temperature_delta * \
|
||||
(air_heat_capacity * heat_capacity / (air_heat_capacity + heat_capacity))
|
||||
air1.temperature = max(air1.temperature - heat / air_heat_capacity, TCMB)
|
||||
occupant.bodytemperature = max(occupant.bodytemperature + heat / heat_capacity, TCMB)
|
||||
mob_occupant.bodytemperature = max(mob_occupant.bodytemperature + heat / heat_capacity, TCMB)
|
||||
|
||||
air1.gases["o2"][MOLES] -= 0.5 / efficiency // Magically consume gas? Why not, we run on cryo magic.
|
||||
|
||||
@@ -254,16 +256,17 @@
|
||||
|
||||
var/list/occupantData = list()
|
||||
if(occupant)
|
||||
occupantData["name"] = occupant.name
|
||||
occupantData["stat"] = occupant.stat
|
||||
occupantData["health"] = occupant.health
|
||||
occupantData["maxHealth"] = occupant.maxHealth
|
||||
var/mob/living/mob_occupant = occupant
|
||||
occupantData["name"] = mob_occupant.name
|
||||
occupantData["stat"] = mob_occupant.stat
|
||||
occupantData["health"] = mob_occupant.health
|
||||
occupantData["maxHealth"] = mob_occupant.maxHealth
|
||||
occupantData["minHealth"] = HEALTH_THRESHOLD_DEAD
|
||||
occupantData["bruteLoss"] = occupant.getBruteLoss()
|
||||
occupantData["oxyLoss"] = occupant.getOxyLoss()
|
||||
occupantData["toxLoss"] = occupant.getToxLoss()
|
||||
occupantData["fireLoss"] = occupant.getFireLoss()
|
||||
occupantData["bodyTemperature"] = occupant.bodytemperature
|
||||
occupantData["bruteLoss"] = mob_occupant.getBruteLoss()
|
||||
occupantData["oxyLoss"] = mob_occupant.getOxyLoss()
|
||||
occupantData["toxLoss"] = mob_occupant.getToxLoss()
|
||||
occupantData["fireLoss"] = mob_occupant.getFireLoss()
|
||||
occupantData["bodyTemperature"] = mob_occupant.bodytemperature
|
||||
data["occupant"] = occupantData
|
||||
|
||||
|
||||
|
||||
@@ -400,8 +400,8 @@
|
||||
var/bz = air_contents.gases["bz"]
|
||||
var/freon = air_contents.gases["freon"]
|
||||
if(n2o || plasma || bz || freon)
|
||||
message_admins("[key_name_admin(usr)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) opened a canister that contains the following: (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
|
||||
log_admin("[key_name(usr)] opened a canister that contains the following at [x], [y], [z]:")
|
||||
message_admins("[ADMIN_LOOKUPFLW(usr)] opened a canister that contains the following: [ADMIN_JMP(src)]")
|
||||
log_admin("[key_name(usr)] opened a canister that contains the following at [COORD(src)]:")
|
||||
if(plasma)
|
||||
log_admin("Plasma")
|
||||
message_admins("Plasma")
|
||||
|
||||
@@ -103,8 +103,9 @@
|
||||
var/plasma = air_contents.gases["plasma"]
|
||||
var/n2o = air_contents.gases["n2o"]
|
||||
if(n2o || plasma)
|
||||
message_admins("[key_name_admin(usr)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""]! (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
|
||||
log_admin("[key_name(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [x], [y], [z]")
|
||||
var/area/A = get_area(src)
|
||||
message_admins("[ADMIN_LOOKUPFLW(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [A][ADMIN_JMP(src)]")
|
||||
log_admin("[key_name(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [A][COORD(src)]")
|
||||
. = TRUE
|
||||
if("direction")
|
||||
if(direction == PUMP_OUT)
|
||||
|
||||
@@ -50,11 +50,6 @@
|
||||
material_id = MAT_PLASMA
|
||||
message = "cm3 of plasma"
|
||||
|
||||
/datum/export/material/plasma/get_cost(obj/O, contr = 0, emag = 0)
|
||||
. = ..()
|
||||
if(emag) // Syndicate pays you more for the plasma.
|
||||
. = round(. * 1.5)
|
||||
|
||||
// Uranium. Still useful for both power generation and nuclear annihilation.
|
||||
/datum/export/material/uranium
|
||||
cost = 400
|
||||
@@ -98,4 +93,4 @@
|
||||
message = "cm3 of glass"
|
||||
material_id = MAT_GLASS
|
||||
export_types = list(/obj/item/stack/sheet/glass, /obj/item/weapon/ore,
|
||||
/obj/item/weapon/shard)
|
||||
/obj/item/weapon/shard)
|
||||
|
||||
@@ -182,14 +182,14 @@
|
||||
/datum/supply_pack/emergency/syndicate
|
||||
name = "NULL_ENTRY"
|
||||
hidden = TRUE
|
||||
cost = 14000
|
||||
cost = 20000
|
||||
contains = list()
|
||||
crate_name = "emergency crate"
|
||||
crate_type = /obj/structure/closet/crate/internals
|
||||
dangerous = TRUE
|
||||
|
||||
/datum/supply_pack/emergency/syndicate/fill(obj/structure/closet/crate/C)
|
||||
var/crate_value = 50
|
||||
var/crate_value = 30
|
||||
var/list/uplink_items = get_uplink_items(SSticker.mode)
|
||||
while(crate_value)
|
||||
var/category = pick(uplink_items)
|
||||
|
||||
@@ -172,7 +172,6 @@ GLOBAL_LIST_EMPTY(asset_datums)
|
||||
|
||||
//DEFINITIONS FOR ASSET DATUMS START HERE.
|
||||
|
||||
|
||||
/datum/asset/simple/tgui
|
||||
assets = list(
|
||||
"tgui.css" = 'tgui/assets/tgui.css',
|
||||
@@ -208,13 +207,6 @@ GLOBAL_LIST_EMPTY(asset_datums)
|
||||
"sig_none.gif" = 'icons/program_icons/sig_none.gif',
|
||||
)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/datum/asset/simple/pda
|
||||
assets = list(
|
||||
"pda_atmos.png" = 'icons/pda_icons/pda_atmos.png',
|
||||
@@ -267,6 +259,26 @@ GLOBAL_LIST_EMPTY(asset_datums)
|
||||
"jquery-1.10.2.min.js" = 'html/IRV/jquery-1.10.2.min.js'
|
||||
)
|
||||
|
||||
/datum/asset/simple/changelog
|
||||
assets = list(
|
||||
"88x31.png" = 'html/88x31.png',
|
||||
"bug-minus.png" = 'html/bug-minus.png',
|
||||
"cross-circle.png" = 'html/cross-circle.png',
|
||||
"hard-hat-exclamation.png" = 'html/hard-hat-exclamation.png',
|
||||
"image-minus.png" = 'html/image-minus.png',
|
||||
"image-plus.png" = 'html/image-plus.png',
|
||||
"music-minus.png" = 'html/music-minus.png',
|
||||
"music-plus.png" = 'html/music-plus.png',
|
||||
"tick-circle.png" = 'html/tick-circle.png',
|
||||
"wrench-screwdriver.png" = 'html/wrench-screwdriver.png',
|
||||
"spell-check.png" = 'html/spell-check.png',
|
||||
"burn-exclamation.png" = 'html/burn-exclamation.png',
|
||||
"chevron.png" = 'html/chevron.png',
|
||||
"chevron-expand.png" = 'html/chevron-expand.png',
|
||||
"scales.png" = 'html/scales.png',
|
||||
"changelog.css" = 'html/changelog.css'
|
||||
)
|
||||
|
||||
//Registers HTML Interface assets.
|
||||
/datum/asset/HTML_interface/register()
|
||||
for(var/path in typesof(/datum/html_interface))
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
entry += " - <font color='black'><b>DEAD</b></font>"
|
||||
if(is_special_character(C.mob))
|
||||
entry += " - <b><font color='red'>Antagonist</font></b>"
|
||||
entry += " (<A HREF='?_src_=holder;adminmoreinfo=\ref[C.mob]'>?</A>)"
|
||||
entry += " [ADMIN_QUE(C.mob)]"
|
||||
entry += " ([round(C.avgping, 1)]ms)"
|
||||
Lines += entry
|
||||
else//If they don't have +ADMIN, only show hidden admins
|
||||
|
||||
@@ -202,7 +202,7 @@
|
||||
item_color = "black"
|
||||
desc = "It's a plain jumpsuit. It has a small dial on the wrist."
|
||||
origin_tech = "syndicate=2"
|
||||
sensor_mode = 0 //Hey who's this guy on the Syndicate Shuttle??
|
||||
sensor_mode = SENSOR_OFF //Hey who's this guy on the Syndicate Shuttle??
|
||||
random_sensor = 0
|
||||
resistance_flags = 0
|
||||
armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
C.use(1)
|
||||
update_clothes_damaged_state(FALSE)
|
||||
obj_integrity = max_integrity
|
||||
to_chat(user, "<span class='notice'>You fix the damages on [src] with [C].</span>")
|
||||
to_chat(user, "<span class='notice'>You fix the damage on [src] with [C].</span>")
|
||||
return 1
|
||||
if(pockets)
|
||||
var/i = pockets.attackby(W, user, params)
|
||||
@@ -161,7 +161,7 @@
|
||||
/obj/item/clothing/obj_break(damage_flag)
|
||||
if(!damaged_clothes)
|
||||
update_clothes_damaged_state(TRUE)
|
||||
|
||||
to_chat(usr, "<span class='notice'>Your [src] starts to fall apart!")
|
||||
|
||||
/obj/item/clothing/proc/update_clothes_damaged_state(damaging = TRUE)
|
||||
var/index = "\ref[initial(icon)]-[initial(icon_state)]"
|
||||
@@ -519,9 +519,9 @@ BLIND // can't see anything
|
||||
slot_flags = SLOT_ICLOTHING
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
|
||||
var/fitted = FEMALE_UNIFORM_FULL // For use in alternate clothing styles for women
|
||||
var/has_sensor = 1//For the crew computer 2 = unable to change mode
|
||||
var/has_sensor = HAS_SENSORS // For the crew computer
|
||||
var/random_sensor = 1
|
||||
var/sensor_mode = 0 /* 1 = Report living/dead, 2 = Report detailed damages, 3 = Report location */
|
||||
var/sensor_mode = NO_SENSORS
|
||||
var/can_adjust = 1
|
||||
var/adjusted = NORMAL_STYLE
|
||||
var/alt_covers_chest = 0 // for adjusted/rolled-down jumpsuits, 0 = exposes chest and arms, 1 = exposes arms only
|
||||
@@ -546,16 +546,26 @@ BLIND // can't see anything
|
||||
tie.color = hastie.color
|
||||
. += tie
|
||||
|
||||
/obj/item/clothing/under/attackby(obj/item/W, mob/user, params)
|
||||
if((has_sensor == BROKEN_SENSORS) && istype(W, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/C = W
|
||||
C.use(1)
|
||||
has_sensor = HAS_SENSORS
|
||||
to_chat(user,"<span class='notice'>You repair the suit sensors on [src] with [C].</span>")
|
||||
return 1
|
||||
|
||||
/obj/item/clothing/under/update_clothes_damaged_state(damaging = TRUE)
|
||||
..()
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
M.update_inv_w_uniform()
|
||||
if(has_sensor > NO_SENSORS)
|
||||
has_sensor = BROKEN_SENSORS
|
||||
|
||||
/obj/item/clothing/under/New()
|
||||
if(random_sensor)
|
||||
//make the sensor mode favor higher levels, except coords.
|
||||
sensor_mode = pick(0, 1, 1, 2, 2, 2, 3, 3)
|
||||
sensor_mode = pick(SENSOR_OFF, SENSOR_LIVING, SENSOR_LIVING, SENSOR_VITALS, SENSOR_VITALS, SENSOR_VITALS, SENSOR_COORDS, SENSOR_COORDS)
|
||||
adjusted = NORMAL_STYLE
|
||||
..()
|
||||
|
||||
@@ -633,15 +643,18 @@ BLIND // can't see anything
|
||||
to_chat(user, "Alt-click on [src] to wear it normally.")
|
||||
else
|
||||
to_chat(user, "Alt-click on [src] to wear it casually.")
|
||||
switch(sensor_mode)
|
||||
if(0)
|
||||
to_chat(user, "Its sensors appear to be disabled.")
|
||||
if(1)
|
||||
to_chat(user, "Its binary life sensors appear to be enabled.")
|
||||
if(2)
|
||||
to_chat(user, "Its vital tracker appears to be enabled.")
|
||||
if(3)
|
||||
to_chat(user, "Its vital tracker and tracking beacon appear to be enabled.")
|
||||
if (has_sensor == BROKEN_SENSORS)
|
||||
to_chat(user, "Its sensors appear to be shorted out.")
|
||||
else if(has_sensor > NO_SENSORS)
|
||||
switch(sensor_mode)
|
||||
if(SENSOR_OFF)
|
||||
to_chat(user, "Its sensors appear to be disabled.")
|
||||
if(SENSOR_LIVING)
|
||||
to_chat(user, "Its binary life sensors appear to be enabled.")
|
||||
if(SENSOR_VITALS)
|
||||
to_chat(user, "Its vital tracker appears to be enabled.")
|
||||
if(SENSOR_COORDS)
|
||||
to_chat(user, "Its vital tracker and tracking beacon appear to be enabled.")
|
||||
if(hastie)
|
||||
to_chat(user, "\A [hastie] is attached to it.")
|
||||
|
||||
@@ -661,10 +674,13 @@ BLIND // can't see anything
|
||||
return
|
||||
if (!can_use(M))
|
||||
return
|
||||
if(src.has_sensor >= 2)
|
||||
if(src.has_sensor == LOCKED_SENSORS)
|
||||
to_chat(usr, "The controls are locked.")
|
||||
return 0
|
||||
if(src.has_sensor <= 0)
|
||||
if(src.has_sensor == BROKEN_SENSORS)
|
||||
to_chat(usr, "The sensors have shorted out!")
|
||||
return 0
|
||||
if(src.has_sensor <= NO_SENSORS)
|
||||
to_chat(usr, "This suit does not have any sensors.")
|
||||
return 0
|
||||
|
||||
|
||||
@@ -178,6 +178,7 @@
|
||||
pockets = /obj/item/weapon/storage/internal/pocket/shoes
|
||||
actions_types = list(/datum/action/item_action/bhop)
|
||||
var/jumpdistance = 5 //-1 from to see the actual distance, e.g 4 goes over 3 tiles
|
||||
var/jumpspeed = 3
|
||||
var/recharging_rate = 60 //default 6 seconds between each dash
|
||||
var/recharging_time = 0 //time until next dash
|
||||
var/jumping = FALSE //are we mid-jump?
|
||||
@@ -198,7 +199,7 @@
|
||||
jumping = TRUE
|
||||
playsound(src.loc, 'sound/effects/stealthoff.ogg', 50, 1, 1)
|
||||
usr.visible_message("<span class='warning'>[usr] dashes foward into the air!</span>")
|
||||
usr.throw_at(target, jumpdistance, 1, spin=0, diagonals_first = 1, callback = CALLBACK(src, .proc/hop_end))
|
||||
usr.throw_at(target, jumpdistance, jumpspeed, spin=0, diagonals_first = 1, callback = CALLBACK(src, .proc/hop_end))
|
||||
|
||||
/obj/item/clothing/shoes/bhop/proc/hop_end()
|
||||
jumping = FALSE
|
||||
@@ -214,4 +215,4 @@
|
||||
name = "blue performer's boots"
|
||||
desc = "These boots were made for dancing."
|
||||
icon_state = "bsing"
|
||||
put_on_delay = 50
|
||||
put_on_delay = 50
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 50, acid = 50)
|
||||
|
||||
/obj/item/clothing/suit/armor/vest
|
||||
name = "armor"
|
||||
name = "armor vest"
|
||||
desc = "A slim armored vest that protects against most types of damage."
|
||||
icon_state = "armoralt"
|
||||
item_state = "armoralt"
|
||||
@@ -140,7 +140,7 @@
|
||||
return 1
|
||||
|
||||
/obj/item/clothing/suit/armor/vest/det_suit
|
||||
name = "armor"
|
||||
name = "detective's armor vest"
|
||||
desc = "An armored vest with a detective's badge on it."
|
||||
icon_state = "detective-armor"
|
||||
allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/ballistic,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder,/obj/item/weapon/melee/classic_baton)
|
||||
|
||||
@@ -335,7 +335,7 @@
|
||||
|
||||
/obj/item/clothing/suit/vapeshirt //wearing this is asking to get beat.
|
||||
name = "Vape Naysh shirt"
|
||||
desc = "A cheap white T-shirt with a big tacky \"VN\" on the front, Why would you wear this unironicly?"
|
||||
desc = "A cheap white T-shirt with a big tacky \"VN\" on the front, Why would you wear this unironically?"
|
||||
icon_state = "vapeshirt"
|
||||
item_state = "vapeshirt"
|
||||
|
||||
|
||||
@@ -224,5 +224,5 @@
|
||||
to_chat(user, "<span class='warning'>The rune can only be used on battlemage armour!</span>")
|
||||
return
|
||||
W.current_charges += 8
|
||||
user <<"<span class='notice'>You charge \the [W]. It can now absorb [W.current_charges] hits.</span>"
|
||||
to_chat(user, "<span class='notice'>You charge \the [W]. It can now absorb [W.current_charges] hits.</span>")
|
||||
qdel(src)
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
icon_state = "captain"
|
||||
item_state = "b_suit"
|
||||
item_color = "captain"
|
||||
sensor_mode = 3
|
||||
sensor_mode = SENSOR_COORDS
|
||||
random_sensor = 0
|
||||
|
||||
/obj/item/clothing/under/rank/cargo
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 30, acid = 30)
|
||||
strip_delay = 50
|
||||
alt_covers_chest = 1
|
||||
sensor_mode = 3
|
||||
sensor_mode = SENSOR_COORDS
|
||||
random_sensor = 0
|
||||
|
||||
/obj/item/clothing/under/rank/security/grey
|
||||
@@ -27,7 +27,7 @@
|
||||
icon_state = "security"
|
||||
item_state = "gy_suit"
|
||||
item_color = "security"
|
||||
|
||||
|
||||
|
||||
/obj/item/clothing/under/rank/warden
|
||||
name = "security suit"
|
||||
|
||||
@@ -61,8 +61,8 @@
|
||||
icon_state = "prisoner"
|
||||
item_state = "o_suit"
|
||||
item_color = "prisoner"
|
||||
has_sensor = 2
|
||||
sensor_mode = 3
|
||||
has_sensor = LOCKED_SENSORS
|
||||
sensor_mode = SENSOR_COORDS
|
||||
random_sensor = 0
|
||||
|
||||
/obj/item/clothing/under/rank/mailman
|
||||
@@ -404,7 +404,7 @@
|
||||
|
||||
/obj/item/clothing/under/gladiator/ash_walker
|
||||
desc = "This gladiator uniform appears to be covered in ash and fairly dated."
|
||||
has_sensor = 0
|
||||
has_sensor = NO_SENSORS
|
||||
|
||||
/obj/item/clothing/under/sundress
|
||||
name = "sundress"
|
||||
|
||||
@@ -8,25 +8,31 @@
|
||||
can_adjust = 0
|
||||
|
||||
/obj/item/clothing/under/shorts/red
|
||||
name = "red athletic shorts"
|
||||
icon_state = "redshorts"
|
||||
item_color = "redshorts"
|
||||
|
||||
/obj/item/clothing/under/shorts/green
|
||||
name = "green athletic shorts"
|
||||
icon_state = "greenshorts"
|
||||
item_color = "greenshorts"
|
||||
|
||||
/obj/item/clothing/under/shorts/blue
|
||||
name = "blue athletic shorts"
|
||||
icon_state = "blueshorts"
|
||||
item_color = "blueshorts"
|
||||
|
||||
/obj/item/clothing/under/shorts/black
|
||||
name = "black athletic shorts"
|
||||
icon_state = "blackshorts"
|
||||
item_color = "blackshorts"
|
||||
|
||||
/obj/item/clothing/under/shorts/grey
|
||||
name = "grey athletic shorts"
|
||||
icon_state = "greyshorts"
|
||||
item_color = "greyshorts"
|
||||
|
||||
/obj/item/clothing/under/shorts/purple
|
||||
name = "purple athletic shorts"
|
||||
icon_state = "purpleshorts"
|
||||
item_color = "purpleshorts"
|
||||
@@ -4,7 +4,7 @@
|
||||
icon_state = "syndicate"
|
||||
item_state = "bl_suit"
|
||||
item_color = "syndicate"
|
||||
has_sensor = 0
|
||||
has_sensor = NO_SENSORS
|
||||
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 40)
|
||||
alt_covers_chest = 1
|
||||
|
||||
|
||||
@@ -178,7 +178,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
|
||||
|
||||
/obj/effect/hallucination/simple/xeno/throw_impact(A)
|
||||
update_icon("alienh_pounce")
|
||||
if(A == target)
|
||||
if(A == target && target.stat!=DEAD)
|
||||
target.Weaken(5)
|
||||
target.visible_message("<span class='danger'>[target] flails around wildly.</span>","<span class ='userdanger'>[name] pounces on you!</span>")
|
||||
|
||||
@@ -286,7 +286,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
|
||||
bubblegum = new(wall, target)
|
||||
sleep(10) //ominous wait
|
||||
var/charged = FALSE //only get hit once
|
||||
while(get_turf(bubblegum) != landing && target)
|
||||
while(get_turf(bubblegum) != landing && target && target.stat != DEAD)
|
||||
bubblegum.forceMove(get_step_towards(bubblegum, landing))
|
||||
bubblegum.setDir(get_dir(bubblegum, landing))
|
||||
target.playsound_local(get_turf(bubblegum), 'sound/effects/meteorimpact.ogg', 150, 1)
|
||||
@@ -356,9 +356,9 @@ Gunshots/explosions/opening doors/less rare audio (done)
|
||||
for(var/i=0,i<hits,i++)
|
||||
target.playsound_local(null, 'sound/weapons/Laser.ogg', 25, 1)
|
||||
if(prob(75))
|
||||
addtimer(CALLBACK(target, /atom/.proc/playsound_local, null, 'sound/weapons/sear.ogg', 25, 1), rand(10,20))
|
||||
addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, 'sound/weapons/sear.ogg', 25, 1), rand(10,20))
|
||||
else
|
||||
addtimer(CALLBACK(target, /atom/.proc/playsound_local, null, 'sound/weapons/effects/searwall.ogg', 25, 1), rand(10,20))
|
||||
addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, 'sound/weapons/effects/searwall.ogg', 25, 1), rand(10,20))
|
||||
sleep(rand(CLICK_CD_RANGE, CLICK_CD_RANGE + 8))
|
||||
target.playsound_local(null, get_sfx("bodyfall"), 25, 1)
|
||||
if(2) //Esword fight
|
||||
@@ -372,9 +372,9 @@ Gunshots/explosions/opening doors/less rare audio (done)
|
||||
for(var/i=0,i<hits,i++)
|
||||
target.playsound_local(null, get_sfx("gunshot"), 25)
|
||||
if(prob(75))
|
||||
addtimer(CALLBACK(target, /atom/.proc/playsound_local, null, 'sound/weapons/pierce.ogg', 25, 1), rand(10,20))
|
||||
addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, 'sound/weapons/pierce.ogg', 25, 1), rand(10,20))
|
||||
else
|
||||
addtimer(CALLBACK(target, /atom/.proc/playsound_local, null, "ricochet", 25, 1), rand(10,20))
|
||||
addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, "ricochet", 25, 1), rand(10,20))
|
||||
sleep(rand(CLICK_CD_RANGE, CLICK_CD_RANGE + 8))
|
||||
target.playsound_local(null, get_sfx("bodyfall"), 25, 1)
|
||||
if(4) //Stunprod + cablecuff
|
||||
|
||||
@@ -168,13 +168,14 @@
|
||||
|
||||
var/offset = prob(50) ? -2 : 2
|
||||
animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking
|
||||
var/sourcename = src.occupant.real_name
|
||||
var/mob/living/mob_occupant = occupant
|
||||
var/sourcename = mob_occupant.real_name
|
||||
var/sourcejob
|
||||
if(ishuman(occupant))
|
||||
var/mob/living/carbon/human/gibee = occupant
|
||||
sourcejob = gibee.job
|
||||
var/sourcenutriment = src.occupant.nutrition / 15
|
||||
var/sourcetotalreagents = src.occupant.reagents.total_volume
|
||||
var/sourcenutriment = mob_occupant.nutrition / 15
|
||||
var/sourcetotalreagents = mob_occupant.reagents.total_volume
|
||||
var/gibtype = /obj/effect/decal/cleanable/blood/gibs
|
||||
var/typeofmeat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human
|
||||
var/typeofskin = /obj/item/stack/sheet/animalhide/human
|
||||
@@ -212,8 +213,8 @@
|
||||
allskin = newskin
|
||||
|
||||
add_logs(user, occupant, "gibbed")
|
||||
src.occupant.death(1)
|
||||
src.occupant.ghostize()
|
||||
mob_occupant.death(1)
|
||||
mob_occupant.ghostize()
|
||||
qdel(src.occupant)
|
||||
spawn(src.gibtime)
|
||||
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
|
||||
|
||||
@@ -416,8 +416,8 @@
|
||||
/datum/chemical_reaction/bananahonk
|
||||
name = "Banana Honk"
|
||||
id = "bananahonk"
|
||||
results = list("bananahonk" = 3)
|
||||
required_reagents = list("banana" = 1, "cream" = 1, "sugar" = 1)
|
||||
results = list("bananahonk" = 2)
|
||||
required_reagents = list("laughter" = 1, "cream" = 1)
|
||||
|
||||
/datum/chemical_reaction/silencer
|
||||
name = "Silencer"
|
||||
@@ -542,9 +542,9 @@
|
||||
results = list("chocolate_milk" = 2)
|
||||
required_reagents = list("milk" = 1, "cocoa" = 1)
|
||||
mix_message = "The color changes as the mixture blends smoothly."
|
||||
|
||||
|
||||
/datum/chemical_reaction/eggnog
|
||||
name = "eggnog"
|
||||
id = "eggnog"
|
||||
results = list("eggnog" = 15)
|
||||
required_reagents = list("rum" = 5, "cream" = 5, "eggyolk" = 5)
|
||||
required_reagents = list("rum" = 5, "cream" = 5, "eggyolk" = 5)
|
||||
@@ -264,7 +264,7 @@
|
||||
time = 40
|
||||
reqs = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/steak/goliath = 1,
|
||||
/obj/item/weapon/legion_skull = 1,
|
||||
/obj/item/organ/hivelord_core/legion = 1,
|
||||
/datum/reagent/consumable/ketchup = 2,
|
||||
/datum/reagent/consumable/capsaicin = 2
|
||||
)
|
||||
|
||||
@@ -111,6 +111,7 @@
|
||||
for(var/datum/plant_gene/trait/trait in seed.genes)
|
||||
trait.on_squash(src, target)
|
||||
|
||||
reagents.reaction(T)
|
||||
for(var/A in T)
|
||||
reagents.reaction(A)
|
||||
|
||||
|
||||
@@ -123,8 +123,8 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/attack_self(mob/living/user)
|
||||
var/area/A = get_area(user)
|
||||
user.visible_message("<span class='warning'>[user] plucks the stem from [src]!</span>", "<span class='userdanger'>You pluck the stem from [src], which begins to hiss loudly!</span>")
|
||||
message_admins("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x], [user.y], [user.z]) <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>(JMP)</a>")
|
||||
log_game("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x],[user.y],[user.z]).")
|
||||
message_admins("[ADMIN_LOOKUPFLW(user)] primed a cherry bomb for detonation at [A] [ADMIN_COORDJMP(user)]")
|
||||
log_game("[key_name(user)] primed a cherry bomb for detonation at [A] [COORD(user)].")
|
||||
prime()
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/deconstruct(disassembled = TRUE)
|
||||
|
||||
@@ -28,8 +28,8 @@
|
||||
throw_speed = 3
|
||||
throw_range = 10
|
||||
|
||||
/obj/item/weapon/reagent_containers/spray/weedspray/New()
|
||||
..()
|
||||
/obj/item/weapon/reagent_containers/spray/weedspray/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent("weedkiller", 100)
|
||||
|
||||
/obj/item/weapon/reagent_containers/spray/weedspray/suicide_act(mob/user)
|
||||
@@ -50,8 +50,8 @@
|
||||
throw_speed = 3
|
||||
throw_range = 10
|
||||
|
||||
/obj/item/weapon/reagent_containers/spray/pestspray/New()
|
||||
..()
|
||||
/obj/item/weapon/reagent_containers/spray/pestspray/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent("pestkiller", 100)
|
||||
|
||||
/obj/item/weapon/reagent_containers/spray/pestspray/suicide_act(mob/user)
|
||||
@@ -135,8 +135,8 @@
|
||||
amount_per_transfer_from_this = 10
|
||||
possible_transfer_amounts = list(1,2,5,10,15,25,50)
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/New()
|
||||
..()
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/Initialize()
|
||||
. = ..()
|
||||
src.pixel_x = rand(-5, 5)
|
||||
src.pixel_y = rand(-5, 5)
|
||||
|
||||
@@ -147,8 +147,8 @@
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "bottle16"
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez/New()
|
||||
..()
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent("eznutriment", 50)
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z
|
||||
@@ -157,8 +157,8 @@
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "bottle18"
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z/New()
|
||||
..()
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent("left4zednutriment", 50)
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh
|
||||
@@ -167,8 +167,8 @@
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "bottle15"
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh/New()
|
||||
..()
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent("robustharvestnutriment", 50)
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/empty
|
||||
@@ -191,8 +191,8 @@
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "bottle19"
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/killer/weedkiller/New()
|
||||
..()
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/killer/weedkiller/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent("weedkiller", 50)
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/killer/pestkiller
|
||||
@@ -201,6 +201,6 @@
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "bottle20"
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/killer/pestkiller/New()
|
||||
..()
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/killer/pestkiller/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent("pestkiller", 50)
|
||||
|
||||
@@ -143,6 +143,15 @@ Librarian
|
||||
/obj/item/soapstone = 1
|
||||
)
|
||||
|
||||
|
||||
/datum/outfit/job/librarian/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
..()
|
||||
|
||||
if(visualsOnly)
|
||||
return
|
||||
|
||||
H.grant_all_languages(omnitongue=TRUE)
|
||||
|
||||
/*
|
||||
Lawyer
|
||||
*/
|
||||
|
||||
@@ -5,9 +5,11 @@
|
||||
speech_verb = "says"
|
||||
whisper_verb = "whispers"
|
||||
key = "0"
|
||||
flags = TONGUELESS_SPEECH
|
||||
flags = TONGUELESS_SPEECH | LANGUAGE_HIDE_ICON_IF_UNDERSTOOD
|
||||
default_priority = 100
|
||||
|
||||
icon_state = "galcom"
|
||||
|
||||
//Syllable Lists
|
||||
/*
|
||||
This list really long, mainly because I can't make up my mind about which mandarin syllables should be removed,
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
speech_verb = "chitters"
|
||||
ask_verb = "chitters inquisitively"
|
||||
exclaim_verb = "chitters loudly"
|
||||
spans = list(SPAN_ROBOT, "drone")
|
||||
spans = list(SPAN_ROBOT)
|
||||
key = "d"
|
||||
flags = NO_STUTTER
|
||||
syllables = list(".", "|")
|
||||
@@ -12,3 +12,5 @@
|
||||
space_chance = 0
|
||||
sentence_chance = 0
|
||||
default_priority = 20
|
||||
|
||||
icon_state = "drone"
|
||||
|
||||
@@ -21,6 +21,21 @@
|
||||
var/static/list/scramble_cache = list()
|
||||
var/default_priority = 0 // the language that an atom knows with the highest "default_priority" is selected by default.
|
||||
|
||||
// if you are seeing someone speak popcorn language, then something is wrong.
|
||||
var/icon = 'icons/misc/language.dmi'
|
||||
var/icon_state = "popcorn"
|
||||
|
||||
/datum/language/proc/display_icon(atom/movable/hearer)
|
||||
var/understands = hearer.has_language(src.type)
|
||||
if(flags & LANGUAGE_HIDE_ICON_IF_UNDERSTOOD && understands)
|
||||
return FALSE
|
||||
if(flags & LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD && !understands)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/language/proc/get_icon()
|
||||
return "<img class=icon src=\ref[icon] iconstate='[icon_state]'>"
|
||||
|
||||
/datum/language/proc/get_random_name(gender, name_count=2, syllable_count=4, syllable_divisor=2)
|
||||
if(!syllables || !syllables.len)
|
||||
if(gender==FEMALE)
|
||||
@@ -93,3 +108,13 @@
|
||||
return speech_verb
|
||||
|
||||
#undef SCRAMBLE_CACHE_LEN
|
||||
|
||||
/proc/get_language_instance(langtype)
|
||||
if(!ispath(langtype, /datum/language))
|
||||
return
|
||||
|
||||
if(!GLOB.language_datums[langtype])
|
||||
var/datum/language/langdatum = new langtype
|
||||
GLOB.language_datums[langtype] = langdatum
|
||||
|
||||
. = GLOB.language_datums[langtype]
|
||||
|
||||
@@ -4,13 +4,15 @@
|
||||
speech_verb = "whistles"
|
||||
ask_verb = "chirps"
|
||||
exclaim_verb = "whistles loudly"
|
||||
spans = list(SPAN_ROBOT, "changeling")
|
||||
spans = list(SPAN_ROBOT)
|
||||
key = "6"
|
||||
flags = NO_STUTTER
|
||||
syllables = list("beep","beep","beep","beep","beep","boop","boop","boop","bop","bop","dee","dee","doo","doo","hiss","hss","buzz","buzz","bzz","ksssh","keey","wurr","wahh","tzzz")
|
||||
space_chance = 10
|
||||
default_priority = 90
|
||||
|
||||
icon_state = "eal"
|
||||
|
||||
/datum/language/machine/get_random_name()
|
||||
if(prob(70))
|
||||
return "[pick(GLOB.posibrain_names)]-[rand(100, 999)]"
|
||||
|
||||
@@ -4,8 +4,9 @@
|
||||
speech_verb = "chimpers"
|
||||
ask_verb = "chimpers"
|
||||
exclaim_verb = "screeches"
|
||||
spans = list("monkey")
|
||||
key = "1"
|
||||
space_chance = 100
|
||||
syllables = list("oop", "aak", "chee", "eek")
|
||||
default_priority = 80
|
||||
|
||||
icon_state = "animal"
|
||||
|
||||
@@ -6,7 +6,9 @@
|
||||
exclaim_verb = "clanks"
|
||||
key = "r"
|
||||
default_priority = 10
|
||||
spans = list(SPAN_ROBOT, "brass")
|
||||
spans = list(SPAN_ROBOT)
|
||||
|
||||
icon_state = "ratvar"
|
||||
|
||||
/datum/language/ratvar/scramble(var/input)
|
||||
. = text2ratvar(input)
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
speech_verb = "warbles"
|
||||
ask_verb = "warbles"
|
||||
exclaim_verb = "warbles"
|
||||
spans = list("slime")
|
||||
key = "k"
|
||||
syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix","*","!")
|
||||
default_priority = 70
|
||||
|
||||
icon_state = "slime"
|
||||
|
||||
@@ -4,12 +4,15 @@
|
||||
speech_verb = "tones"
|
||||
ask_verb = "tones inquisitively"
|
||||
exclaim_verb = "tones loudly"
|
||||
spans = list(SPAN_ROBOT, "swarmer")
|
||||
spans = list(SPAN_ROBOT)
|
||||
key = "s"
|
||||
flags = NO_STUTTER
|
||||
space_chance = 100
|
||||
sentence_chance = 0
|
||||
default_priority = 60
|
||||
|
||||
icon_state = "swarmer"
|
||||
|
||||
// since various flats and sharps are the same,
|
||||
// all non-accidental notes are doubled in the list
|
||||
/* The list with unicode symbols for the accents.
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
speech_verb = "hisses"
|
||||
ask_verb = "hisses"
|
||||
exclaim_verb = "hisses"
|
||||
spans = list("alien")
|
||||
key = "4"
|
||||
syllables = list("sss","sSs","SSS")
|
||||
default_priority = 50
|
||||
|
||||
icon_state = "xeno"
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
return FALSE
|
||||
|
||||
smooth_zlevel(world.maxz)
|
||||
SortAreas()
|
||||
repopulate_sorted_areas()
|
||||
|
||||
//initialize things that are normally initialized after map load
|
||||
initTemplateBounds(bounds)
|
||||
@@ -74,6 +74,9 @@
|
||||
//initialize things that are normally initialized after map load
|
||||
initTemplateBounds(bounds)
|
||||
|
||||
if(!SSmapping.loading_ruins) //Will be done manually during mapping ss init
|
||||
repopulate_sorted_areas()
|
||||
|
||||
log_game("[name] loaded at at [T.x],[T.y],[T.z]")
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
var/output_dir = SOUTH
|
||||
|
||||
/obj/machinery/mineral/proc/unload_mineral(atom/movable/S)
|
||||
S.loc = loc
|
||||
S.forceMove(loc)
|
||||
var/turf/T = get_step(src,output_dir)
|
||||
if(T)
|
||||
S.loc = T
|
||||
S.forceMove(T)
|
||||
@@ -1,3 +1,5 @@
|
||||
#define SMELT_AMOUNT 10
|
||||
|
||||
/**********************Mineral processing unit console**************************/
|
||||
|
||||
/obj/machinery/mineral/processing_unit_console
|
||||
@@ -10,182 +12,50 @@
|
||||
var/machinedir = EAST
|
||||
speed_process = 1
|
||||
|
||||
/obj/machinery/mineral/processing_unit_console/New()
|
||||
..()
|
||||
spawn(7)
|
||||
src.machine = locate(/obj/machinery/mineral/processing_unit, get_step(src, machinedir))
|
||||
if (machine)
|
||||
machine.CONSOLE = src
|
||||
else
|
||||
qdel(src)
|
||||
/obj/machinery/mineral/processing_unit_console/Initialize()
|
||||
. = ..()
|
||||
machine = locate(/obj/machinery/mineral/processing_unit, get_step(src, machinedir))
|
||||
if (machine)
|
||||
machine.CONSOLE = src
|
||||
else
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/mineral/processing_unit_console/attack_hand(mob/user)
|
||||
|
||||
var/dat = "<b>Smelter control console</b><br><br>"
|
||||
//iron
|
||||
if(machine.ore_iron || machine.ore_glass || machine.ore_plasma || machine.ore_uranium || machine.ore_gold || machine.ore_silver || machine.ore_diamond || machine.ore_clown || machine.ore_adamantine)
|
||||
if(machine.ore_iron)
|
||||
if (machine.selected_iron==1)
|
||||
dat += "<A href='?src=\ref[src];sel_iron=no'><font color='green'>Smelting</font></A> "
|
||||
else
|
||||
dat += "<A href='?src=\ref[src];sel_iron=yes'><font color='red'>Not smelting</font></A> "
|
||||
dat += "Iron: [machine.ore_iron]<br>"
|
||||
else
|
||||
machine.selected_iron = 0
|
||||
|
||||
//sand - glass
|
||||
if(machine.ore_glass)
|
||||
if (machine.selected_glass==1)
|
||||
dat += "<A href='?src=\ref[src];sel_glass=no'><font color='green'>Smelting</font></A> "
|
||||
else
|
||||
dat += "<A href='?src=\ref[src];sel_glass=yes'><font color='red'>Not smelting</font></A> "
|
||||
dat += "Sand: [machine.ore_glass]<br>"
|
||||
else
|
||||
machine.selected_glass = 0
|
||||
|
||||
//plasma
|
||||
if(machine.ore_plasma)
|
||||
if (machine.selected_plasma==1)
|
||||
dat += "<A href='?src=\ref[src];sel_plasma=no'><font color='green'>Smelting</font></A> "
|
||||
else
|
||||
dat += "<A href='?src=\ref[src];sel_plasma=yes'><font color='red'>Not smelting</font></A> "
|
||||
dat += "Plasma: [machine.ore_plasma]<br>"
|
||||
else
|
||||
machine.selected_plasma = 0
|
||||
|
||||
//uranium
|
||||
if(machine.ore_uranium)
|
||||
if (machine.selected_uranium==1)
|
||||
dat += "<A href='?src=\ref[src];sel_uranium=no'><font color='green'>Smelting</font></A> "
|
||||
else
|
||||
dat += "<A href='?src=\ref[src];sel_uranium=yes'><font color='red'>Not smelting</font></A> "
|
||||
dat += "Uranium: [machine.ore_uranium]<br>"
|
||||
else
|
||||
machine.selected_uranium = 0
|
||||
|
||||
//gold
|
||||
if(machine.ore_gold)
|
||||
if (machine.selected_gold==1)
|
||||
dat += "<A href='?src=\ref[src];sel_gold=no'><font color='green'>Smelting</font></A> "
|
||||
else
|
||||
dat += "<A href='?src=\ref[src];sel_gold=yes'><font color='red'>Not smelting</font></A> "
|
||||
dat += "Gold: [machine.ore_gold]<br>"
|
||||
else
|
||||
machine.selected_gold = 0
|
||||
|
||||
//silver
|
||||
if(machine.ore_silver)
|
||||
if (machine.selected_silver==1)
|
||||
dat += "<A href='?src=\ref[src];sel_silver=no'><font color='green'>Smelting</font></A> "
|
||||
else
|
||||
dat += "<A href='?src=\ref[src];sel_silver=yes'><font color='red'>Not smelting</font></A> "
|
||||
dat += "Silver: [machine.ore_silver]<br>"
|
||||
else
|
||||
machine.selected_silver = 0
|
||||
|
||||
//diamond
|
||||
if(machine.ore_diamond)
|
||||
if (machine.selected_diamond==1)
|
||||
dat += "<A href='?src=\ref[src];sel_diamond=no'><font color='green'>Smelting</font></A> "
|
||||
else
|
||||
dat += "<A href='?src=\ref[src];sel_diamond=yes'><font color='red'>Not smelting</font></A> "
|
||||
dat += "Diamond: [machine.ore_diamond]<br>"
|
||||
else
|
||||
machine.selected_diamond = 0
|
||||
|
||||
//bananium
|
||||
if(machine.ore_clown)
|
||||
if (machine.selected_clown==1)
|
||||
dat += "<A href='?src=\ref[src];sel_clown=no'><font color='green'>Smelting</font></A> "
|
||||
else
|
||||
dat += "<A href='?src=\ref[src];sel_clown=yes'><font color='red'>Not smelting</font></A> "
|
||||
dat += "Bananium: [machine.ore_clown]<br>"
|
||||
else
|
||||
machine.selected_clown = 0
|
||||
|
||||
//titanium
|
||||
if(machine.ore_titanium)
|
||||
if (machine.selected_titanium==1)
|
||||
dat += "<A href='?src=\ref[src];sel_titanium=no'><font color='green'>Smelting</font></A> "
|
||||
else
|
||||
dat += "<A href='?src=\ref[src];sel_titanium=yes'><font color='red'>Not smelting</font></A> "
|
||||
dat += "Titanium: [machine.ore_titanium]<br>"
|
||||
else
|
||||
machine.selected_titanium = 0
|
||||
|
||||
|
||||
//On or off
|
||||
dat += text("Machine is currently ")
|
||||
if (machine.on==1)
|
||||
dat += text("<A href='?src=\ref[src];set_on=off'>On</A> ")
|
||||
else
|
||||
dat += text("<A href='?src=\ref[src];set_on=on'>Off</A> ")
|
||||
else
|
||||
dat+="---No Materials Loaded---"
|
||||
|
||||
|
||||
user << browse(dat, "window=console_processing_unit")
|
||||
if(!machine)
|
||||
return
|
||||
|
||||
var/dat = machine.get_machine_data()
|
||||
|
||||
var/datum/browser/popup = new(user, "processing", "Smelting Console", 300, 500)
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
|
||||
/obj/machinery/mineral/processing_unit_console/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
usr.set_machine(src)
|
||||
src.add_fingerprint(usr)
|
||||
if(href_list["sel_iron"])
|
||||
if (href_list["sel_iron"] == "yes")
|
||||
machine.selected_iron = 1
|
||||
else
|
||||
machine.selected_iron = 0
|
||||
if(href_list["sel_glass"])
|
||||
if (href_list["sel_glass"] == "yes")
|
||||
machine.selected_glass = 1
|
||||
else
|
||||
machine.selected_glass = 0
|
||||
if(href_list["sel_plasma"])
|
||||
if (href_list["sel_plasma"] == "yes")
|
||||
machine.selected_plasma = 1
|
||||
else
|
||||
machine.selected_plasma = 0
|
||||
if(href_list["sel_uranium"])
|
||||
if (href_list["sel_uranium"] == "yes")
|
||||
machine.selected_uranium = 1
|
||||
else
|
||||
machine.selected_uranium = 0
|
||||
if(href_list["sel_gold"])
|
||||
if (href_list["sel_gold"] == "yes")
|
||||
machine.selected_gold = 1
|
||||
else
|
||||
machine.selected_gold = 0
|
||||
if(href_list["sel_silver"])
|
||||
if (href_list["sel_silver"] == "yes")
|
||||
machine.selected_silver = 1
|
||||
else
|
||||
machine.selected_silver = 0
|
||||
if(href_list["sel_diamond"])
|
||||
if (href_list["sel_diamond"] == "yes")
|
||||
machine.selected_diamond = 1
|
||||
else
|
||||
machine.selected_diamond = 0
|
||||
if(href_list["sel_clown"])
|
||||
if (href_list["sel_clown"] == "yes")
|
||||
machine.selected_clown = 1
|
||||
else
|
||||
machine.selected_clown = 0
|
||||
if(href_list["sel_titanium"])
|
||||
if (href_list["sel_titanium"] == "yes")
|
||||
machine.selected_titanium = 1
|
||||
else
|
||||
machine.selected_titanium = 0
|
||||
add_fingerprint(usr)
|
||||
|
||||
if(href_list["material"])
|
||||
machine.selected_material = href_list["material"]
|
||||
machine.selected_alloy = null
|
||||
|
||||
if(href_list["alloy"])
|
||||
machine.selected_material = null
|
||||
machine.selected_alloy = href_list["alloy"]
|
||||
|
||||
if(href_list["set_on"])
|
||||
if (href_list["set_on"] == "on")
|
||||
machine.on = 1
|
||||
else
|
||||
machine.on = 0
|
||||
src.updateUsrDialog()
|
||||
machine.on = (href_list["set_on"] == "on")
|
||||
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
/obj/machinery/mineral/processing_unit_console/Destroy()
|
||||
machine = null
|
||||
return ..()
|
||||
|
||||
|
||||
/**********************Mineral processing unit**************************/
|
||||
|
||||
|
||||
@@ -196,117 +66,84 @@
|
||||
density = 1
|
||||
anchored = 1
|
||||
var/obj/machinery/mineral/CONSOLE = null
|
||||
var/ore_gold = 0;
|
||||
var/ore_silver = 0;
|
||||
var/ore_diamond = 0;
|
||||
var/ore_glass = 0;
|
||||
var/ore_plasma = 0;
|
||||
var/ore_uranium = 0;
|
||||
var/ore_iron = 0;
|
||||
var/ore_clown = 0;
|
||||
var/ore_adamantine = 0;
|
||||
var/ore_titanium = 0;
|
||||
var/selected_gold = 0
|
||||
var/selected_silver = 0
|
||||
var/selected_diamond = 0
|
||||
var/selected_glass = 0
|
||||
var/selected_plasma = 0
|
||||
var/selected_uranium = 0
|
||||
var/selected_iron = 0
|
||||
var/selected_clown = 0
|
||||
var/selected_titanium = 0
|
||||
var/on = 0 //0 = off, 1 =... oh you know!
|
||||
var/datum/material_container/materials
|
||||
var/on = FALSE
|
||||
var/selected_material = MAT_METAL
|
||||
var/selected_alloy = null
|
||||
var/datum/research/files
|
||||
|
||||
/obj/machinery/mineral/processing_unit/Initialize()
|
||||
. = ..()
|
||||
proximity_monitor = new(src, 1)
|
||||
materials = new(src, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE),INFINITY)
|
||||
files = new /datum/research/smelter(src)
|
||||
|
||||
/obj/machinery/mineral/processing_unit/Destroy()
|
||||
CONSOLE = null
|
||||
QDEL_NULL(materials)
|
||||
QDEL_NULL(files)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/mineral/processing_unit/HasProximity(atom/movable/AM)
|
||||
if(istype(AM, /obj/item/weapon/ore) && AM.loc == get_step(src, input_dir))
|
||||
process_ore(AM)
|
||||
|
||||
/obj/machinery/mineral/processing_unit/proc/process_ore(obj/item/weapon/ore/O)
|
||||
var/material_amount = materials.get_item_material_amount(O)
|
||||
if(!materials.has_space(material_amount))
|
||||
unload_mineral(O)
|
||||
else
|
||||
materials.insert_item(O)
|
||||
qdel(O)
|
||||
if(CONSOLE)
|
||||
CONSOLE.updateUsrDialog()
|
||||
|
||||
/obj/machinery/mineral/processing_unit/proc/get_machine_data()
|
||||
var/dat = "<b>Smelter control console</b><br><br>"
|
||||
for(var/mat_id in materials.materials)
|
||||
var/datum/material/M = materials.materials[mat_id]
|
||||
dat += "<span class=\"res_name\">[M.name]: </span>[M.amount] cm³"
|
||||
if (selected_material == mat_id)
|
||||
dat += " <i>Smelting</i>"
|
||||
else
|
||||
dat += " <A href='?src=\ref[CONSOLE];material=[mat_id]'><b>Not Smelting</b></A> "
|
||||
dat += "<br>"
|
||||
|
||||
dat += "<br><br>"
|
||||
dat += "<b>Smelt Alloys</b><br>"
|
||||
|
||||
for(var/v in files.known_designs)
|
||||
var/datum/design/D = files.known_designs[v]
|
||||
dat += "<span class=\"res_name\">[D.name] "
|
||||
if (selected_alloy == D.id)
|
||||
dat += " <i>Smelting</i>"
|
||||
else
|
||||
dat += " <A href='?src=\ref[CONSOLE];alloy=[D.id]'><b>Not Smelting</b></A> "
|
||||
dat += "<br>"
|
||||
|
||||
dat += "<br><br>"
|
||||
//On or off
|
||||
dat += "Machine is currently "
|
||||
if (on)
|
||||
dat += "<A href='?src=\ref[CONSOLE];set_on=off'>On</A> "
|
||||
else
|
||||
dat += "<A href='?src=\ref[CONSOLE];set_on=on'>Off</A> "
|
||||
|
||||
return dat
|
||||
|
||||
/obj/machinery/mineral/processing_unit/process()
|
||||
for(var/i in 1 to 10)
|
||||
if (on)
|
||||
if (selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
|
||||
if (ore_glass > 0)
|
||||
ore_glass--
|
||||
generate_mineral(/obj/item/stack/sheet/glass)
|
||||
else
|
||||
on = 0
|
||||
continue
|
||||
if (selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && selected_iron && !selected_clown && !selected_titanium)
|
||||
if (ore_glass > 0 && ore_iron > 0)
|
||||
ore_glass--
|
||||
ore_iron--
|
||||
generate_mineral(/obj/item/stack/sheet/rglass)
|
||||
else
|
||||
on = 0
|
||||
continue
|
||||
if (!selected_glass && selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
|
||||
if (ore_gold > 0)
|
||||
ore_gold--
|
||||
generate_mineral(/obj/item/stack/sheet/mineral/gold)
|
||||
else
|
||||
on = 0
|
||||
continue
|
||||
if (!selected_glass && !selected_gold && selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
|
||||
if (ore_silver > 0)
|
||||
ore_silver--
|
||||
generate_mineral(/obj/item/stack/sheet/mineral/silver)
|
||||
else
|
||||
on = 0
|
||||
continue
|
||||
if (!selected_glass && !selected_gold && !selected_silver && selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
|
||||
if (ore_diamond > 0)
|
||||
ore_diamond--
|
||||
generate_mineral(/obj/item/stack/sheet/mineral/diamond)
|
||||
else
|
||||
on = 0
|
||||
continue
|
||||
if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
|
||||
if (ore_plasma > 0)
|
||||
ore_plasma--
|
||||
generate_mineral(/obj/item/stack/sheet/mineral/plasma)
|
||||
else
|
||||
on = 0
|
||||
continue
|
||||
if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
|
||||
if (ore_uranium > 0)
|
||||
ore_uranium--
|
||||
generate_mineral(/obj/item/stack/sheet/mineral/uranium)
|
||||
else
|
||||
on = 0
|
||||
continue
|
||||
if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && selected_iron && !selected_clown && !selected_titanium)
|
||||
if (ore_iron > 0)
|
||||
ore_iron--
|
||||
generate_mineral(/obj/item/stack/sheet/metal)
|
||||
else
|
||||
on = 0
|
||||
continue
|
||||
if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && selected_plasma && !selected_uranium && selected_iron && !selected_clown && !selected_titanium)
|
||||
if (ore_iron > 0 && ore_plasma > 0)
|
||||
ore_iron--
|
||||
ore_plasma--
|
||||
generate_mineral(/obj/item/stack/sheet/plasteel)
|
||||
else
|
||||
on = 0
|
||||
continue
|
||||
if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && selected_clown && !selected_titanium)
|
||||
if (ore_clown > 0)
|
||||
ore_clown--
|
||||
generate_mineral(/obj/item/stack/sheet/mineral/bananium)
|
||||
else
|
||||
on = 0
|
||||
continue
|
||||
if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && selected_titanium)
|
||||
if (ore_titanium > 0)
|
||||
ore_titanium--
|
||||
generate_mineral(/obj/item/stack/sheet/mineral/titanium)
|
||||
else
|
||||
on = 0
|
||||
continue
|
||||
if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && selected_plasma && !selected_uranium && !selected_iron && !selected_clown && selected_titanium)
|
||||
if (ore_titanium > 0)
|
||||
ore_titanium--
|
||||
ore_plasma--
|
||||
generate_mineral(/obj/item/stack/sheet/mineral/plastitanium)
|
||||
else
|
||||
on = 0
|
||||
continue
|
||||
if (on)
|
||||
if(selected_material)
|
||||
smelt_ore()
|
||||
|
||||
else if(selected_alloy)
|
||||
smelt_alloy()
|
||||
|
||||
|
||||
if(CONSOLE)
|
||||
CONSOLE.updateUsrDialog()
|
||||
|
||||
|
||||
//THESE TWO ARE CODED FOR URIST TO USE WHEN HE GETS AROUND TO IT.
|
||||
//They were coded on 18 Feb 2012. If you're reading this in 2015, then firstly congratulations on the world not ending on 21 Dec 2012 and secondly, Urist is apparently VERY lazy. ~Errorage
|
||||
//Even in the dark year of 2016, where /tg/ is dead, Urist still hasn't finished this -Bawhoppennn
|
||||
@@ -327,104 +164,57 @@
|
||||
on = 0
|
||||
continue*/
|
||||
|
||||
|
||||
//if a non valid combination is selected
|
||||
|
||||
var/b = 1 //this part checks if all required ores are available
|
||||
|
||||
if (!(selected_gold || selected_silver ||selected_diamond || selected_uranium | selected_plasma || selected_iron || selected_iron))
|
||||
b = 0
|
||||
|
||||
if (selected_gold == 1)
|
||||
if (ore_gold <= 0)
|
||||
b = 0
|
||||
if (selected_silver == 1)
|
||||
if (ore_silver <= 0)
|
||||
b = 0
|
||||
if (selected_diamond == 1)
|
||||
if (ore_diamond <= 0)
|
||||
b = 0
|
||||
if (selected_uranium == 1)
|
||||
if (ore_uranium <= 0)
|
||||
b = 0
|
||||
if (selected_plasma == 1)
|
||||
if (ore_plasma <= 0)
|
||||
b = 0
|
||||
if (selected_iron == 1)
|
||||
if (ore_iron <= 0)
|
||||
b = 0
|
||||
if (selected_glass == 1)
|
||||
if (ore_glass <= 0)
|
||||
b = 0
|
||||
if (selected_clown == 1)
|
||||
if (ore_clown <= 0)
|
||||
b = 0
|
||||
|
||||
if (b) //if they are, deduct one from each, produce slag and shut the machine off
|
||||
if (selected_gold == 1)
|
||||
ore_gold--
|
||||
if (selected_silver == 1)
|
||||
ore_silver--
|
||||
if (selected_diamond == 1)
|
||||
ore_diamond--
|
||||
if (selected_uranium == 1)
|
||||
ore_uranium--
|
||||
if (selected_plasma == 1)
|
||||
ore_plasma--
|
||||
if (selected_iron == 1)
|
||||
ore_iron--
|
||||
if (selected_clown == 1)
|
||||
ore_clown--
|
||||
generate_mineral(/obj/item/weapon/ore/slag)
|
||||
on = 0
|
||||
else
|
||||
on = 0
|
||||
break
|
||||
break
|
||||
/obj/machinery/mineral/processing_unit/proc/smelt_ore()
|
||||
var/datum/material/mat = materials.materials[selected_material]
|
||||
if(mat)
|
||||
var/sheets_to_remove = (mat.amount >= (MINERAL_MATERIAL_AMOUNT * SMELT_AMOUNT) ) ? SMELT_AMOUNT : round(mat.amount / MINERAL_MATERIAL_AMOUNT)
|
||||
if(!sheets_to_remove)
|
||||
on = FALSE
|
||||
else
|
||||
break
|
||||
var/turf/T = get_step(src,input_dir)
|
||||
if(T)
|
||||
var/n = 0
|
||||
for(var/obj/item/O in T)
|
||||
n++
|
||||
if(n>10)
|
||||
break
|
||||
if (istype(O,/obj/item/weapon/ore/iron))
|
||||
ore_iron++;
|
||||
O.loc = null
|
||||
continue
|
||||
if (istype(O,/obj/item/weapon/ore/glass))
|
||||
ore_glass++;
|
||||
O.loc = null
|
||||
continue
|
||||
if (istype(O,/obj/item/weapon/ore/diamond))
|
||||
ore_diamond++;
|
||||
O.loc = null
|
||||
continue
|
||||
if (istype(O,/obj/item/weapon/ore/plasma))
|
||||
ore_plasma++
|
||||
O.loc = null
|
||||
continue
|
||||
if (istype(O,/obj/item/weapon/ore/gold))
|
||||
ore_gold++
|
||||
O.loc = null
|
||||
continue
|
||||
if (istype(O,/obj/item/weapon/ore/silver))
|
||||
ore_silver++
|
||||
O.loc = null
|
||||
continue
|
||||
if (istype(O,/obj/item/weapon/ore/uranium))
|
||||
ore_uranium++
|
||||
O.loc = null
|
||||
continue
|
||||
if (istype(O,/obj/item/weapon/ore/bananium))
|
||||
ore_clown++
|
||||
O.loc = null
|
||||
continue
|
||||
unload_mineral(O)
|
||||
var/out = get_step(src, output_dir)
|
||||
materials.retrieve_sheets(sheets_to_remove, selected_material, out)
|
||||
|
||||
|
||||
/obj/machinery/mineral/processing_unit/proc/smelt_alloy()
|
||||
var/datum/design/alloy = files.FindDesignByID(selected_alloy) //check if it's a valid design
|
||||
if(!alloy)
|
||||
on = FALSE
|
||||
return
|
||||
|
||||
var/amount = can_smelt(alloy)
|
||||
|
||||
if(!amount)
|
||||
on = FALSE
|
||||
return
|
||||
|
||||
materials.use_amount(alloy.materials, amount)
|
||||
|
||||
generate_mineral(alloy.build_path)
|
||||
|
||||
/obj/machinery/mineral/processing_unit/proc/can_smelt(datum/design/D)
|
||||
if(D.make_reagents.len)
|
||||
return 0
|
||||
|
||||
var/build_amount = SMELT_AMOUNT
|
||||
|
||||
|
||||
for(var/mat_id in D.materials)
|
||||
var/M = D.materials[mat_id]
|
||||
var/datum/material/smelter_mat = materials.materials[mat_id]
|
||||
|
||||
if(!M || !smelter_mat)
|
||||
return 0
|
||||
|
||||
build_amount = min(build_amount, round(smelter_mat.amount / M))
|
||||
|
||||
return build_amount
|
||||
|
||||
/obj/machinery/mineral/processing_unit/proc/generate_mineral(P)
|
||||
var/O = new P(src)
|
||||
unload_mineral(O)
|
||||
|
||||
/obj/machinery/mineral/processing_unit/on_deconstruction()
|
||||
materials.retrieve_all()
|
||||
..()
|
||||
|
||||
#undef SMELT_AMOUNT
|
||||
@@ -12,9 +12,6 @@
|
||||
output_dir = SOUTH
|
||||
req_access = list(GLOB.access_mineral_storeroom)
|
||||
var/req_access_reclaim = GLOB.access_mining_station
|
||||
var/stk_types = list()
|
||||
var/stk_amt = list()
|
||||
var/stack_list = list() //Key: Type. Value: Instance of type.
|
||||
var/obj/item/weapon/card/id/inserted_id
|
||||
var/points = 0
|
||||
var/ore_pickup_rate = 15
|
||||
@@ -24,11 +21,20 @@
|
||||
speed_process = 1
|
||||
var/message_sent = FALSE
|
||||
var/list/ore_buffer = list()
|
||||
var/datum/material_container/materials
|
||||
var/datum/research/files
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/New()
|
||||
..()
|
||||
/obj/machinery/mineral/ore_redemption/Initialize()
|
||||
. = ..()
|
||||
var/obj/item/weapon/circuitboard/machine/ore_redemption/B = new
|
||||
B.apply_default_parts(src)
|
||||
materials = new(src, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE),INFINITY)
|
||||
files = new /datum/research/smelter(src)
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/Destroy()
|
||||
QDEL_NULL(materials)
|
||||
QDEL_NULL(files)
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/circuitboard/machine/ore_redemption
|
||||
name = "Ore Redemption (Machine Board)"
|
||||
@@ -55,35 +61,67 @@
|
||||
point_upgrade = point_upgrade_temp
|
||||
sheet_per_ore = sheet_per_ore_temp
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/proc/process_sheet(obj/item/weapon/ore/O)
|
||||
var/obj/item/stack/sheet/processed_sheet = SmeltMineral(O)
|
||||
if(processed_sheet)
|
||||
var/obj/item/stack/sheet/s
|
||||
if(!stack_list[processed_sheet])
|
||||
s = new processed_sheet(src, FALSE)
|
||||
s.amount = 0
|
||||
stack_list[processed_sheet] = s
|
||||
s = stack_list[processed_sheet]
|
||||
s.amount += sheet_per_ore //Stack the sheets
|
||||
ore_buffer -= O
|
||||
qdel(O) //... garbage collect
|
||||
/obj/machinery/mineral/ore_redemption/proc/smelt_ore(obj/item/weapon/ore/O)
|
||||
|
||||
ore_buffer -= O
|
||||
|
||||
if(O && O.refined_type)
|
||||
points += O.points * point_upgrade
|
||||
|
||||
var/material_amount = materials.get_item_material_amount(O)
|
||||
|
||||
if(!material_amount)
|
||||
qdel(O) //no materials, incinerate it
|
||||
|
||||
else if(!materials.has_space(material_amount)) //if there is no space, eject it
|
||||
unload_mineral(O)
|
||||
|
||||
else
|
||||
materials.insert_item(O) //insert it
|
||||
qdel(O)
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/proc/can_smelt_alloy(datum/design/D)
|
||||
if(D.make_reagents.len)
|
||||
return 0
|
||||
|
||||
var/build_amount = 1
|
||||
|
||||
for(var/mat_id in D.materials)
|
||||
var/M = D.materials[mat_id]
|
||||
var/datum/material/redemption_mat = materials.materials[mat_id]
|
||||
|
||||
if(!M || !redemption_mat)
|
||||
return 0
|
||||
|
||||
build_amount = min(build_amount, round(redemption_mat.amount / M))
|
||||
|
||||
return build_amount
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/proc/process_ores(list/ores_to_process)
|
||||
var/current_amount = 0
|
||||
for(var/ore in ores_to_process)
|
||||
if(current_amount >= ore_pickup_rate)
|
||||
break
|
||||
process_sheet(ore)
|
||||
smelt_ore(ore)
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/proc/send_console_message()
|
||||
if(z != ZLEVEL_STATION || !LAZYLEN(stack_list))
|
||||
if(z != ZLEVEL_STATION)
|
||||
return
|
||||
message_sent = TRUE
|
||||
var/area/A = get_area(src)
|
||||
var/msg = "Now available in [A]:<br>"
|
||||
for(var/s in stack_list)
|
||||
var/obj/item/stack/sheet/sheet = stack_list[s]
|
||||
msg += "[capitalize(sheet.name)]: [sheet.amount] sheets<br>"
|
||||
|
||||
var/has_minerals = FALSE
|
||||
|
||||
for(var/mat_id in materials.materials)
|
||||
var/datum/material/M = materials.materials[mat_id]
|
||||
var/mineral_amount = M.amount / MINERAL_MATERIAL_AMOUNT
|
||||
if(mineral_amount)
|
||||
has_minerals = TRUE
|
||||
msg += "[capitalize(M.name)]: [mineral_amount] sheets<br>"
|
||||
|
||||
if(!has_minerals)
|
||||
return
|
||||
|
||||
for(var/obj/machinery/requests_console/D in GLOB.allConsoles)
|
||||
if(D.receive_ore_updates)
|
||||
@@ -144,15 +182,8 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/on_deconstruction()
|
||||
empty_content()
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/proc/SmeltMineral(obj/item/weapon/ore/O)
|
||||
if(O && O.refined_type)
|
||||
var/obj/item/stack/sheet/M = O.refined_type
|
||||
points += O.points * point_upgrade
|
||||
return M
|
||||
qdel(O)//No refined type? Purge it.
|
||||
return
|
||||
materials.retrieve_all()
|
||||
..()
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/attack_hand(mob/user)
|
||||
if(..())
|
||||
@@ -169,30 +200,26 @@
|
||||
else
|
||||
dat += "No ID inserted. <A href='?src=\ref[src];insert_id=1'>Insert ID.</A><br><br>"
|
||||
|
||||
for(var/O in stack_list)
|
||||
var/obj/item/stack/sheet/s = stack_list[O]
|
||||
if(s.amount)
|
||||
dat += "[capitalize(s.name)]: [s.amount] <A href='?src=\ref[src];release=[s.type]'>Release</A><br>"
|
||||
for(var/mat_id in materials.materials)
|
||||
var/datum/material/M = materials.materials[mat_id]
|
||||
if(M.amount)
|
||||
var/sheet_amount = M.amount / MINERAL_MATERIAL_AMOUNT
|
||||
dat += "[capitalize(M.name)]: [sheet_amount] "
|
||||
if(sheet_amount >= 1)
|
||||
dat += "<A href='?src=\ref[src];release=[mat_id]'>Release</A><br>"
|
||||
else
|
||||
dat += "<span class='linkOff'>Release</span><br>"
|
||||
|
||||
var/obj/item/stack/sheet/metalstack
|
||||
if(/obj/item/stack/sheet/metal in stack_list)
|
||||
metalstack = stack_list[/obj/item/stack/sheet/metal]
|
||||
for(var/v in files.known_designs)
|
||||
var/datum/design/D = files.known_designs[v]
|
||||
if(can_smelt_alloy(D))
|
||||
dat += "[D.name]: <A href='?src=\ref[src];alloy=[D.id]'>Smelt</A><br>"
|
||||
else
|
||||
dat += "[D.name]: <span class='linkOff'>Smelt</span><br>"
|
||||
|
||||
var/obj/item/stack/sheet/plasmastack
|
||||
if((/obj/item/stack/sheet/mineral/plasma in stack_list))
|
||||
plasmastack = stack_list[/obj/item/stack/sheet/mineral/plasma]
|
||||
dat += "<br><div class='statusDisplay'><b>Mineral Value List:</b><br>[get_ore_values()]</div>"
|
||||
|
||||
var/obj/item/stack/sheet/mineral/titaniumstack
|
||||
if((/obj/item/stack/sheet/mineral/titanium in stack_list))
|
||||
titaniumstack = stack_list[/obj/item/stack/sheet/mineral/titanium]
|
||||
|
||||
if(metalstack && plasmastack && min(metalstack.amount, plasmastack.amount))
|
||||
dat += "Plasteel Alloy (Metal + Plasma): <A href='?src=\ref[src];alloytype1=/obj/item/stack/sheet/metal;alloytype2=/obj/item/stack/sheet/mineral/plasma;alloytypeout=/obj/item/stack/sheet/plasteel'>Smelt</A><BR>"
|
||||
if(titaniumstack && plasmastack && min(titaniumstack.amount, plasmastack.amount))
|
||||
dat += "Plastitanium Alloy (Titanium + Plasma): <A href='?src=\ref[src];alloytype1=/obj/item/stack/sheet/mineral/titanium;alloytype2=/obj/item/stack/sheet/mineral/plasma;alloytypeout=/obj/item/stack/sheet/mineral/plastitanium'>Smelt</A><BR>"
|
||||
dat += "<br><div class='statusDisplay'><b>Mineral Value List:</b><BR>[get_ore_values()]</div>"
|
||||
|
||||
var/datum/browser/popup = new(user, "console_stacking_machine", "Ore Redemption Machine", 400, 500)
|
||||
var/datum/browser/popup = new(user, "ore_redemption_machine", "Ore Redemption Machine", 400, 500)
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
return
|
||||
@@ -228,69 +255,52 @@
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Not a valid ID!</span>")
|
||||
if(href_list["release"])
|
||||
if(check_access(inserted_id) || allowed(usr)) //Check the ID inside, otherwise check the user.
|
||||
if(!(text2path(href_list["release"]) in stack_list))
|
||||
if(check_access(inserted_id) || allowed(usr)) //Check the ID inside, otherwise check the user
|
||||
var/mat_id = href_list["release"]
|
||||
if(!materials.materials[mat_id])
|
||||
return
|
||||
var/obj/item/stack/sheet/inp = stack_list[text2path(href_list["release"])]
|
||||
var/obj/item/stack/sheet/out = new inp.type(src, 0, FALSE)
|
||||
|
||||
var/datum/material/mat = materials.materials[mat_id]
|
||||
var/stored_amount = mat.amount / MINERAL_MATERIAL_AMOUNT
|
||||
|
||||
if(!stored_amount)
|
||||
return
|
||||
|
||||
var/desired = input("How many sheets?", "How many sheets to eject?", 1) as null|num
|
||||
out.amount = round(min(desired,50,inp.amount))
|
||||
if(out.amount >= 1)
|
||||
inp.amount -= out.amount
|
||||
unload_mineral(out)
|
||||
if(inp.amount < 1)
|
||||
stack_list -= text2path(href_list["release"])
|
||||
qdel(inp)
|
||||
var/sheets_to_remove = round(min(desired,50,stored_amount))
|
||||
|
||||
var/out = get_step(src, output_dir)
|
||||
materials.retrieve_sheets(sheets_to_remove, mat_id, out)
|
||||
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Required access not found.</span>")
|
||||
if(href_list["alloytype1"] && href_list["alloytype2"] && href_list["alloytypeout"])
|
||||
var/alloytype1 = text2path(href_list["alloytype1"])
|
||||
var/alloytype2 = text2path(href_list["alloytype2"])
|
||||
var/alloytypeout = text2path(href_list["alloytypeout"])
|
||||
if(check_access(inserted_id) || allowed(usr))
|
||||
if(!(alloytype1 in stack_list))
|
||||
return
|
||||
if(!(alloytype2 in stack_list))
|
||||
return
|
||||
var/obj/item/stack/sheet/stack1 = stack_list[alloytype1]
|
||||
var/obj/item/stack/sheet/stack2 = stack_list[alloytype2]
|
||||
|
||||
if(href_list["alloy"])
|
||||
var/alloy_id = href_list["alloy"]
|
||||
var/datum/design/alloy = files.FindDesignByID(alloy_id)
|
||||
if((check_access(inserted_id) || allowed(usr)) && alloy)
|
||||
var/desired = input("How many sheets?", "How many sheets would you like to smelt?", 1) as null|num
|
||||
var/obj/item/stack/sheet/alloyout = new alloytypeout
|
||||
alloyout.amount = round(min(desired,50,stack1.amount,stack2.amount))
|
||||
if(alloyout.amount >= 1)
|
||||
stack1.amount -= alloyout.amount
|
||||
stack2.amount -= alloyout.amount
|
||||
unload_mineral(alloyout)
|
||||
if(stack1.amount < 1)
|
||||
stack_list -= stack1
|
||||
qdel(stack1)
|
||||
if(stack2.amount < 1)
|
||||
stack_list -= stack2
|
||||
qdel(stack2)
|
||||
var/smelt_amount = can_smelt_alloy(alloy)
|
||||
var/amount = round(min(desired,50,smelt_amount))
|
||||
materials.use_amount(alloy.materials, amount)
|
||||
|
||||
var/output = new alloy.build_path(src)
|
||||
if(istype(output, /obj/item/stack/sheet))
|
||||
var/obj/item/stack/sheet/mineral/produced_alloy = output
|
||||
produced_alloy.amount = amount
|
||||
unload_mineral(produced_alloy)
|
||||
else
|
||||
unload_mineral(output)
|
||||
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Required access not found.</span>")
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/ex_act(severity, target)
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
do_sparks(5, TRUE, src)
|
||||
..()
|
||||
|
||||
//empty the redemption machine by stacks of at most max_amount (50 at this time) size
|
||||
/obj/machinery/mineral/ore_redemption/proc/empty_content()
|
||||
var/obj/item/stack/sheet/s
|
||||
|
||||
for(var/O in stack_list)
|
||||
s = stack_list[O]
|
||||
while(s.amount > s.max_amount)
|
||||
new s.type(loc,s.max_amount)
|
||||
s.use(s.max_amount)
|
||||
s.forceMove(get_turf(src))
|
||||
s.layer = initial(s.layer)
|
||||
s.plane = initial(s.plane)
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/power_change()
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
@@ -193,9 +193,7 @@
|
||||
qdel(voucher)
|
||||
|
||||
/obj/machinery/mineral/equipment_vendor/ex_act(severity, target)
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
do_sparks(5, TRUE, src)
|
||||
if(prob(50 / severity) && severity < 3)
|
||||
qdel(src)
|
||||
|
||||
|
||||
@@ -278,8 +278,8 @@
|
||||
|
||||
var/turf/T = deploy_location
|
||||
if(T.z != ZLEVEL_MINING && T.z != ZLEVEL_LAVALAND)//only report capsules away from the mining/lavaland level
|
||||
message_admins("[key_name_admin(usr)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) activated a bluespace capsule away from the mining level! (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)")
|
||||
log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [T.x], [T.y], [T.z]")
|
||||
message_admins("[ADMIN_LOOKUPFLW(usr)] activated a bluespace capsule away from the mining level! [ADMIN_JMP(T)]")
|
||||
log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [get_area(T)][COORD(T)]")
|
||||
template.load(deploy_location, centered = TRUE)
|
||||
new /obj/effect/particle_effect/smoke(get_turf(src))
|
||||
qdel(src)
|
||||
|
||||
@@ -248,18 +248,18 @@
|
||||
|
||||
if(notify_admins)
|
||||
if(triggered_by == 1)
|
||||
message_admins("An explosion has triggered a [name] to detonate at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>.")
|
||||
message_admins("An explosion has triggered a [name] to detonate at [ADMIN_COORDJMP(bombturf)].")
|
||||
else if(triggered_by == 2)
|
||||
message_admins("A signal has triggered a [name] to detonate at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>. Igniter attacher: [key_name_admin(attacher)]<A HREF='?_src_=holder;adminmoreinfo=\ref[attacher]'>?</A> (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[attacher]'>FLW</A>)")
|
||||
message_admins("A signal has triggered a [name] to detonate at [ADMIN_COORDJMP(bombturf)]. Igniter attacher: [ADMIN_LOOKUPFLW(attacher)]")
|
||||
else
|
||||
message_admins("[key_name_admin(user)]<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A> (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[user]'>FLW</A>) has triggered a [name] to detonate at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>.")
|
||||
message_admins("[ADMIN_LOOKUPFLW(attacher)] has triggered a [name] to detonate at [ADMIN_COORDJMP(bombturf)].")
|
||||
if(triggered_by == 1)
|
||||
log_game("An explosion has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])")
|
||||
log_game("An explosion has primed a [name] for detonation at [A][COORD(bombturf)]")
|
||||
else if(triggered_by == 2)
|
||||
log_game("A signal has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z]). Igniter attacher: [key_name(attacher)].")
|
||||
log_game("A signal has primed a [name] for detonation at [A][COORD(bombturf)]. Igniter attacher: [key_name(attacher)].")
|
||||
else
|
||||
user.visible_message("<span class='warning'>[user] strikes \the [src], causing a chain reaction!</span>", "<span class='danger'>You strike \the [src], causing a chain reaction.</span>")
|
||||
log_game("[key_name(user)] has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])")
|
||||
log_game("[key_name(user)] has primed a [name] for detonation at [A][COORD(bombturf)]")
|
||||
spawn(det_time)
|
||||
if(primed)
|
||||
if(quality == 3)
|
||||
|
||||
@@ -2,6 +2,11 @@
|
||||
|
||||
INITIALIZE_IMMEDIATE(/mob/dead)
|
||||
|
||||
/mob/dead/Initialize()
|
||||
. = ..()
|
||||
if(config.cross_allowed)
|
||||
verbs += /mob/dead/proc/server_hop
|
||||
|
||||
/mob/dead/dust() //ghosts can't be vaporised.
|
||||
return
|
||||
|
||||
@@ -9,4 +14,29 @@ INITIALIZE_IMMEDIATE(/mob/dead)
|
||||
return
|
||||
|
||||
/mob/dead/ConveyorMove() //lol
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
|
||||
/mob/dead/proc/server_hop()
|
||||
set category = "OOC"
|
||||
set name = "Server Hop!"
|
||||
set desc= "Jump to the other server"
|
||||
if(notransform)
|
||||
return
|
||||
if(!config.cross_allowed)
|
||||
verbs -= /mob/dead/proc/server_hop
|
||||
to_chat(src, "<span class='notice'>Server Hop has been disabled.</span>")
|
||||
return
|
||||
if (alert(src, "Jump to server running at [config.cross_address]?", "Server Hop", "Yes", "No") != "Yes")
|
||||
return 0
|
||||
if (client && config.cross_allowed)
|
||||
to_chat(src, "<span class='notice'>Sending you to [config.cross_address].</span>")
|
||||
new /obj/screen/splash(client)
|
||||
notransform = TRUE
|
||||
sleep(29) //let the animation play
|
||||
notransform = FALSE
|
||||
winset(src, null, "command=.options") //other wise the user never knows if byond is downloading resources
|
||||
client << link(config.cross_address + "?server_hop=[key]")
|
||||
else
|
||||
to_chat(src, "<span class='error'>There is no other server configured!</span>")
|
||||
|
||||
@@ -58,9 +58,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
|
||||
|
||||
verbs += /mob/dead/observer/proc/dead_tele
|
||||
|
||||
if(config.cross_allowed)
|
||||
verbs += /mob/dead/observer/proc/server_hop
|
||||
|
||||
if(icon_state in GLOB.ghost_forms_with_directions_list)
|
||||
ghostimage_default = image(src.icon,src,src.icon_state + "_nodir")
|
||||
else
|
||||
@@ -297,7 +294,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
/mob/dead/observer/Stat()
|
||||
..()
|
||||
if(statpanel("Status"))
|
||||
if(SSticker && SSticker.mode)
|
||||
if(SSticker.HasRoundStarted())
|
||||
for(var/datum/gang/G in SSticker.mode.gangs)
|
||||
if(G.is_dominating)
|
||||
stat(null, "[G.name] Gang Takeover: [max(G.domination_time_remaining(), 0)]")
|
||||
@@ -354,9 +351,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
if(!isobserver(usr))
|
||||
to_chat(usr, "Not when you're not dead!")
|
||||
return
|
||||
var/A
|
||||
A = input("Area to jump to", "BOOYEA", A) as null|anything in GLOB.sortedAreas
|
||||
var/area/thearea = A
|
||||
var/list/filtered = list()
|
||||
for(var/V in GLOB.sortedAreas)
|
||||
var/area/A = V
|
||||
if(!A.hidden)
|
||||
filtered += A
|
||||
var/area/thearea = input("Area to jump to", "BOOYEA") as null|anything in filtered
|
||||
|
||||
if(!thearea)
|
||||
return
|
||||
|
||||
@@ -585,29 +586,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
target.faction = list("neutral")
|
||||
return 1
|
||||
|
||||
/mob/dead/observer/proc/server_hop()
|
||||
set category = "Ghost"
|
||||
set name = "Server Hop!"
|
||||
set desc= "Jump to the other server"
|
||||
if(notransform)
|
||||
return
|
||||
if(!config.cross_allowed)
|
||||
verbs -= /mob/dead/observer/proc/server_hop
|
||||
to_chat(src, "<span class='notice'>Server Hop has been disabled.</span>")
|
||||
return
|
||||
if (alert(src, "Jump to server running at [config.cross_address]?", "Server Hop", "Yes", "No") != "Yes")
|
||||
return 0
|
||||
if (client && config.cross_allowed)
|
||||
to_chat(src, "<span class='notice'>Sending you to [config.cross_address].</span>")
|
||||
new /obj/screen/splash(client)
|
||||
notransform = TRUE
|
||||
sleep(29) //let the animation play
|
||||
notransform = FALSE
|
||||
winset(src, null, "command=.options") //other wise the user never knows if byond is downloading resources
|
||||
client << link(config.cross_address + "?server_hop=[key]")
|
||||
else
|
||||
to_chat(src, "<span class='error'>There is no other server configured!</span>")
|
||||
|
||||
/proc/show_server_hop_transfer_screen(expected_key)
|
||||
//only show it to incoming ghosts
|
||||
for(var/mob/dead/observer/O in GLOB.player_list)
|
||||
|
||||
@@ -50,7 +50,8 @@
|
||||
if(C.has_brain_worms())
|
||||
var/mob/living/simple_animal/borer/B = C.has_brain_worms()
|
||||
B.leave_victim() //Should remove borer if the brain is removed - RR
|
||||
transfer_identity(C)
|
||||
if(!gc_destroyed || (owner && !owner.gc_destroyed))
|
||||
transfer_identity(C)
|
||||
C.update_hair()
|
||||
|
||||
/obj/item/organ/brain/prepare_eat()
|
||||
@@ -60,6 +61,8 @@
|
||||
name = "[L.name]'s brain"
|
||||
if(brainmob || decoy_override)
|
||||
return
|
||||
if(!L.mind)
|
||||
return
|
||||
brainmob = new(src)
|
||||
brainmob.name = L.real_name
|
||||
brainmob.real_name = L.real_name
|
||||
|
||||
@@ -728,7 +728,7 @@
|
||||
|
||||
/mob/living/carbon/can_be_revived()
|
||||
. = ..()
|
||||
if(!getorgan(/obj/item/organ/brain))
|
||||
if(!getorgan(/obj/item/organ/brain) && (!mind || !mind.changeling))
|
||||
return 0
|
||||
|
||||
/mob/living/carbon/harvest(mob/living/user)
|
||||
|
||||
@@ -119,9 +119,7 @@
|
||||
visible_message("<span class='danger'>The [M.name] has shocked [src]!</span>", \
|
||||
"<span class='userdanger'>The [M.name] has shocked [src]!</span>")
|
||||
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
do_sparks(5, TRUE, src)
|
||||
var/power = M.powerlevel + rand(0,3)
|
||||
Weaken(power)
|
||||
if(stuttering < power)
|
||||
|
||||
@@ -24,7 +24,8 @@
|
||||
if(!no_bodyparts)
|
||||
if(no_organs)//so the organs don't get transfered inside the bodyparts we'll drop.
|
||||
for(var/X in internal_organs)
|
||||
qdel(X)
|
||||
if(no_brain || !istype(X, /obj/item/organ/brain))
|
||||
qdel(X)
|
||||
else //we're going to drop all bodyparts except chest, so the only organs that needs spilling are those inside it.
|
||||
for(var/X in internal_organs)
|
||||
var/obj/item/organ/O = X
|
||||
@@ -42,6 +43,9 @@
|
||||
if(no_brain && istype(I, /obj/item/organ/brain))
|
||||
qdel(I)
|
||||
continue
|
||||
if(no_organs && !istype(I, /obj/item/organ/brain))
|
||||
qdel(I)
|
||||
continue
|
||||
I.Remove(src)
|
||||
I.forceMove(get_turf(src))
|
||||
I.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5)
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
dna.species.spec_death(gibbed, src)
|
||||
|
||||
if(SSticker && SSticker.mode)
|
||||
if(SSticker.HasRoundStarted())
|
||||
SSblackbox.ReportDeath(src)
|
||||
if(mind && mind.devilinfo)
|
||||
INVOKE_ASYNC(mind.devilinfo, /datum/devilinfo.proc/beginResurrectionCheck, src)
|
||||
|
||||
@@ -142,10 +142,12 @@
|
||||
return not_handled //For future deeper overrides
|
||||
|
||||
/mob/living/carbon/human/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE)
|
||||
var/index = get_held_index_of_item(I)
|
||||
. = ..() //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should.
|
||||
if(!. || !I)
|
||||
return
|
||||
|
||||
if(index && dna.species.mutanthands)
|
||||
put_in_hand(new dna.species.mutanthands(), index)
|
||||
if(I == wear_suit)
|
||||
if(s_store && invdrop)
|
||||
dropItemToGround(s_store, TRUE) //It makes no sense for your suit storage to stay on you if you drop your suit.
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
/mob/living/carbon/human/say_quote(input, spans, message_mode)
|
||||
/mob/living/carbon/human/say_mod(input, message_mode)
|
||||
verb_say = dna.species.say_mod
|
||||
. = ..()
|
||||
if(src.slurring)
|
||||
input = attach_spans(input, spans)
|
||||
return "slurs, \"[input]\""
|
||||
|
||||
if(slurring)
|
||||
return "slurs"
|
||||
else
|
||||
. = ..()
|
||||
|
||||
/mob/living/carbon/human/treat_message(message)
|
||||
message = dna.species.handle_speech(message,src)
|
||||
|
||||
@@ -73,6 +73,9 @@
|
||||
//Ears
|
||||
var/obj/item/organ/ears/mutantears = /obj/item/organ/ears
|
||||
|
||||
//Hands
|
||||
var/obj/item/mutanthands = null
|
||||
|
||||
///////////
|
||||
// PROCS //
|
||||
///////////
|
||||
@@ -139,15 +142,16 @@
|
||||
qdel(lungs)
|
||||
lungs = null
|
||||
|
||||
if(eyes)
|
||||
qdel(eyes)
|
||||
eyes = new mutanteyes
|
||||
eyes.Insert(C)
|
||||
if(C.get_bodypart("head"))
|
||||
if(eyes)
|
||||
qdel(eyes)
|
||||
eyes = new mutanteyes
|
||||
eyes.Insert(C)
|
||||
|
||||
if(ears)
|
||||
qdel(ears)
|
||||
ears = new mutantears
|
||||
ears.Insert(C)
|
||||
if(ears)
|
||||
qdel(ears)
|
||||
ears = new mutantears
|
||||
ears.Insert(C)
|
||||
|
||||
if((!(NOBREATH in species_traits)) && !lungs)
|
||||
if(mutantlungs)
|
||||
@@ -169,6 +173,21 @@
|
||||
if(exotic_bloodtype && C.dna.blood_type != exotic_bloodtype)
|
||||
C.dna.blood_type = exotic_bloodtype
|
||||
|
||||
if(old_species.mutanthands)
|
||||
for(var/obj/item/I in C.held_items)
|
||||
if(istype(I, old_species.mutanthands))
|
||||
qdel(I)
|
||||
|
||||
if(mutanthands)
|
||||
// Drop items in hands
|
||||
// If you're lucky enough to have a NODROP item, then it stays.
|
||||
for(var/V in C.held_items)
|
||||
var/obj/item/I = V
|
||||
if(istype(I))
|
||||
C.dropItemToGround(I)
|
||||
else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand
|
||||
C.put_in_hands(new mutanthands())
|
||||
|
||||
/datum/species/proc/on_species_loss(mob/living/carbon/C)
|
||||
if(C.dna.species.exotic_bloodtype)
|
||||
C.dna.blood_type = random_blood_type()
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
name = "Infectious Zombie"
|
||||
id = "memezombies"
|
||||
limbs_id = "zombie"
|
||||
mutanthands = /obj/item/zombie_hand
|
||||
no_equip = list(slot_wear_mask, slot_head)
|
||||
armor = 20 // 120 damage to KO a zombie, which kills it
|
||||
speedmod = 2
|
||||
@@ -27,29 +28,15 @@
|
||||
|
||||
/datum/species/zombie/infectious/on_species_gain(mob/living/carbon/C, datum/species/old_species)
|
||||
. = ..()
|
||||
// Drop items in hands
|
||||
// If you're a zombie lucky enough to have a NODROP item, then it stays.
|
||||
for(var/V in C.held_items)
|
||||
var/obj/item/I = V
|
||||
if(istype(I))
|
||||
if(C.dropItemToGround(I))
|
||||
var/obj/item/zombie_hand/zh = new /obj/item/zombie_hand()
|
||||
C.put_in_hands(zh)
|
||||
else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand
|
||||
var/obj/item/zombie_hand/zh = new /obj/item/zombie_hand()
|
||||
C.put_in_hands(zh)
|
||||
|
||||
// Next, deal with the source of this zombie corruption
|
||||
// Deal with the source of this zombie corruption
|
||||
// Infection organ needs to be handled separately from mutant_organs
|
||||
// because it persists through species transitions
|
||||
var/obj/item/organ/zombie_infection/infection
|
||||
infection = C.getorganslot("zombie_infection")
|
||||
if(!infection)
|
||||
infection = new(C)
|
||||
|
||||
/datum/species/zombie/infectious/on_species_loss(mob/living/carbon/C)
|
||||
. = ..()
|
||||
for(var/obj/item/I in C.held_items)
|
||||
if(istype(I, /obj/item/zombie_hand))
|
||||
qdel(I)
|
||||
infection = new()
|
||||
infection.Insert(C)
|
||||
|
||||
|
||||
// Your skin falls off
|
||||
|
||||
@@ -29,6 +29,13 @@
|
||||
med_hud_set_status()
|
||||
|
||||
/mob/living/Destroy()
|
||||
if(LAZYLEN(status_effects))
|
||||
for(var/s in status_effects)
|
||||
var/datum/status_effect/S = s
|
||||
if(S.on_remove_on_mob_delete) //the status effect calls on_remove when its mob is deleted
|
||||
qdel(S)
|
||||
else
|
||||
S.be_replaced()
|
||||
if(ranged_ability)
|
||||
ranged_ability.remove_ranged_ability(src)
|
||||
if(buckled)
|
||||
@@ -597,7 +604,7 @@
|
||||
return name
|
||||
|
||||
/mob/living/update_gravity(has_gravity,override = 0)
|
||||
if(!SSticker || !SSticker.mode)
|
||||
if(!SSticker.HasRoundStarted())
|
||||
return
|
||||
if(has_gravity)
|
||||
clear_alert("weightless")
|
||||
|
||||
@@ -172,7 +172,7 @@
|
||||
|
||||
|
||||
/mob/living/attack_slime(mob/living/simple_animal/slime/M)
|
||||
if(!SSticker || !SSticker.mode)
|
||||
if(!SSticker.HasRoundStarted())
|
||||
to_chat(M, "You cannot attack people before the game has started.")
|
||||
return
|
||||
|
||||
|
||||
@@ -423,18 +423,17 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
|
||||
return 3
|
||||
return 0
|
||||
|
||||
/mob/living/say_quote(input, list/spans, message_mode)
|
||||
var/tempinput = attach_spans(input, spans)
|
||||
/mob/living/say_mod(input, message_mode)
|
||||
if(message_mode == MODE_WHISPER)
|
||||
return "[verb_whisper], \"[tempinput]\""
|
||||
if(message_mode == MODE_WHISPER_CRIT)
|
||||
return "[verb_whisper] in [p_their()] last breath, \"[tempinput]\""
|
||||
if (stuttering)
|
||||
return "stammers, \"[tempinput]\""
|
||||
if (getBrainLoss() >= 60)
|
||||
return "gibbers, \"[tempinput]\""
|
||||
|
||||
return ..()
|
||||
. = verb_whisper
|
||||
else if(message_mode == MODE_WHISPER_CRIT)
|
||||
. = "[verb_whisper] in [p_their()] last breath"
|
||||
else if(stuttering)
|
||||
. = "stammers"
|
||||
else if(getBrainLoss() >= 60)
|
||||
. = "gibbers"
|
||||
else
|
||||
. = ..()
|
||||
|
||||
/mob/living/get_default_language()
|
||||
if(selected_default_language)
|
||||
@@ -448,5 +447,5 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
|
||||
/mob/living/proc/open_language_menu(mob/user)
|
||||
language_menu.ui_interact(user)
|
||||
|
||||
/mob/living/whisper(message as text)
|
||||
say("#[message]")
|
||||
/mob/living/whisper(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null)
|
||||
say("#[message]", bubble_type, spans, sanitize, language)
|
||||
|
||||
@@ -238,7 +238,7 @@
|
||||
else if(icontype == "Angel")
|
||||
icon_state = "ai-angel"
|
||||
//else
|
||||
//usr <<"You can only change your display once!"
|
||||
//to_chat(usr, "You can only change your display once!")
|
||||
//return
|
||||
|
||||
/mob/living/silicon/ai/Stat()
|
||||
@@ -351,7 +351,7 @@
|
||||
if(isAI(usr))
|
||||
var/mob/living/silicon/ai/AI = src
|
||||
if(AI.control_disabled)
|
||||
src << "Wireless control is disabled!"
|
||||
to_chat(src, "Wireless control is disabled!")
|
||||
return
|
||||
SSshuttle.cancelEvac(src)
|
||||
return
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
|
||||
/mob/living/silicon/ai/attack_alien(mob/living/carbon/alien/humanoid/M)
|
||||
if(!SSticker || !SSticker.mode)
|
||||
if(!SSticker.HasRoundStarted())
|
||||
to_chat(M, "You cannot attack people before the game has started.")
|
||||
return
|
||||
..()
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
//Holopad
|
||||
if(istype(ai.current, /obj/machinery/holopad))
|
||||
var/obj/machinery/holopad/H = ai.current
|
||||
H.move_hologram(ai)
|
||||
H.move_hologram(ai, T)
|
||||
|
||||
/mob/camera/aiEye/Move()
|
||||
return 0
|
||||
|
||||
@@ -271,6 +271,7 @@
|
||||
/obj/item/roller/robo,
|
||||
/obj/item/borg/cyborghug/medical,
|
||||
/obj/item/stack/medical/gauze/cyborg,
|
||||
/obj/item/weapon/organ_storage,
|
||||
/obj/item/borg/lollipop)
|
||||
emag_modules = list(/obj/item/weapon/reagent_containers/borghypo/hacked)
|
||||
ratvar_modules = list(
|
||||
|
||||
@@ -287,17 +287,13 @@
|
||||
to_chat(user, "<span class='warning'>The welder must be on for this task!</span>")
|
||||
else
|
||||
if(W.force) //if force is non-zero
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
do_sparks(5, TRUE, src)
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/bot/bullet_act(obj/item/projectile/Proj)
|
||||
if(Proj && (Proj.damage_type == BRUTE || Proj.damage_type == BURN))
|
||||
if(prob(75) && Proj.damage > 0)
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
do_sparks(5, TRUE, src)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/bot/emp_act(severity)
|
||||
|
||||
@@ -259,9 +259,7 @@
|
||||
if(prob(50))
|
||||
new /obj/item/bodypart/l_arm/robot(Tsec)
|
||||
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
do_sparks(3, TRUE, src)
|
||||
..()
|
||||
|
||||
/obj/machinery/bot_core/cleanbot
|
||||
|
||||
@@ -390,9 +390,7 @@ Auto Patrol[]"},
|
||||
if(lasercolor == "r")
|
||||
new /obj/item/clothing/suit/redtag(Tsec)
|
||||
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
do_sparks(3, TRUE, src)
|
||||
|
||||
new /obj/effect/decal/cleanable/oil(loc)
|
||||
..()
|
||||
|
||||
@@ -381,9 +381,7 @@
|
||||
var/obj/item/stack/tile/plasteel/T = new (Tsec)
|
||||
T.amount = 1
|
||||
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
do_sparks(3, TRUE, src)
|
||||
..()
|
||||
|
||||
/obj/machinery/bot_core/floorbot
|
||||
|
||||
@@ -530,9 +530,7 @@
|
||||
if(emagged && prob(25))
|
||||
playsound(loc, 'sound/voice/minsult.ogg', 50, 0)
|
||||
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
do_sparks(3, TRUE, src)
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/bot/medbot/proc/declare(crit_patient)
|
||||
|
||||
@@ -719,9 +719,7 @@
|
||||
cell.update_icon()
|
||||
cell = null
|
||||
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
do_sparks(3, TRUE, src)
|
||||
|
||||
new /obj/effect/decal/cleanable/oil(loc)
|
||||
..()
|
||||
|
||||
@@ -397,9 +397,7 @@ Auto Patrol: []"},
|
||||
if(prob(50))
|
||||
new /obj/item/bodypart/l_arm/robot(Tsec)
|
||||
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
do_sparks(3, TRUE, src)
|
||||
|
||||
new /obj/effect/decal/cleanable/oil(loc)
|
||||
..()
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
status_flags = CANPUSH
|
||||
attack_sound = 'sound/weapons/punch1.ogg'
|
||||
see_in_dark = 7
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
@@ -31,11 +32,14 @@
|
||||
var/list/construct_spells = list()
|
||||
var/playstyle_string = "<b>You are a generic construct! Your job is to not exist, and you should probably adminhelp this.</b>"
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/Initialize()
|
||||
. = ..()
|
||||
update_health_hud()
|
||||
for(var/spell in construct_spells)
|
||||
AddSpell(new spell(null))
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/Login()
|
||||
..()
|
||||
to_chat(src, playstyle_string)
|
||||
@@ -84,6 +88,10 @@
|
||||
/mob/living/simple_animal/hostile/construct/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, tesla_shock = 0, illusion = 0, stun = TRUE)
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
|
||||
. = ..()
|
||||
if(updating_health)
|
||||
update_health_hud()
|
||||
|
||||
/////////////////Juggernaut///////////////
|
||||
/mob/living/simple_animal/hostile/construct/armored
|
||||
@@ -268,3 +276,22 @@
|
||||
/mob/living/simple_animal/hostile/construct/harvester/hostile //actually hostile, will move around, hit things
|
||||
AIStatus = AI_ON
|
||||
environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP
|
||||
|
||||
|
||||
|
||||
/////////////////////////////ui stuff/////////////////////////////
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/update_health_hud()
|
||||
if(hud_used)
|
||||
if(health >= maxHealth)
|
||||
hud_used.healths.icon_state = "[icon_state]_health0"
|
||||
else if(health > maxHealth*0.8)
|
||||
hud_used.healths.icon_state = "[icon_state]_health2"
|
||||
else if(health > maxHealth*0.6)
|
||||
hud_used.healths.icon_state = "[icon_state]_health3"
|
||||
else if(health > maxHealth*0.4)
|
||||
hud_used.healths.icon_state = "[icon_state]_health4"
|
||||
else if(health > maxHealth*0.2)
|
||||
hud_used.healths.icon_state = "[icon_state]_health5"
|
||||
else
|
||||
hud_used.healths.icon_state = "[icon_state]_health6"
|
||||
@@ -53,7 +53,5 @@
|
||||
ranged = 1
|
||||
|
||||
/mob/living/simple_animal/hostile/hivebot/death(gibbed)
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
do_sparks(3, TRUE, src)
|
||||
..(1)
|
||||
@@ -187,8 +187,9 @@ Difficulty: Medium
|
||||
animate(src, transform = matrix()*0.9, time = 3, easing = BOUNCE_EASING)
|
||||
for(var/i in 1 to 3)
|
||||
sleep(1)
|
||||
if(QDELETED(src)) //we got hit and died, rip us
|
||||
if(QDELETED(src) || stat == DEAD) //we got hit and died, rip us
|
||||
qdel(F)
|
||||
swooping &= ~SWOOP_DAMAGEABLE
|
||||
return
|
||||
animate(src, transform = matrix()*0.7, time = 7)
|
||||
swooping |= SWOOP_INVULNERABLE
|
||||
|
||||
@@ -220,7 +220,7 @@
|
||||
else
|
||||
target.lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE
|
||||
name = "Toggle Nightvision \[ON]"
|
||||
target.update_sight()
|
||||
target.update_sight()
|
||||
|
||||
/mob/living/simple_animal/hostile/statue/sentience_act()
|
||||
faction -= "neutral"
|
||||
|
||||
@@ -254,10 +254,10 @@
|
||||
if(icon_gib)
|
||||
new /obj/effect/overlay/temp/gib_animation/animal(loc, icon_gib)
|
||||
|
||||
/mob/living/simple_animal/say_quote(input, list/spans)
|
||||
/mob/living/simple_animal/say_mod(input, message_mode)
|
||||
if(speak_emote && speak_emote.len)
|
||||
verb_say = pick(speak_emote)
|
||||
return ..()
|
||||
. = ..()
|
||||
|
||||
/mob/living/simple_animal/emote(act, m_type=1, message = null)
|
||||
if(stat)
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
GLOB.dead_mob_list -= src
|
||||
GLOB.living_mob_list -= src
|
||||
GLOB.all_clockwork_mobs -= src
|
||||
GLOB.mob_directory -= tag
|
||||
if(observers && observers.len)
|
||||
for(var/M in observers)
|
||||
var/mob/dead/observe = M
|
||||
@@ -22,6 +23,7 @@
|
||||
/mob/Initialize()
|
||||
tag = "mob_[next_mob_id++]"
|
||||
GLOB.mob_list += src
|
||||
GLOB.mob_directory[tag] = src
|
||||
if(stat == DEAD)
|
||||
GLOB.dead_mob_list += src
|
||||
else
|
||||
|
||||
@@ -326,7 +326,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
|
||||
return 0
|
||||
|
||||
/proc/is_special_character(mob/M) // returns 1 for special characters and 2 for heroes of gamemode //moved out of admins.dm because things other than admin procs were calling this.
|
||||
if(!SSticker || !SSticker.mode)
|
||||
if(!SSticker.HasRoundStarted())
|
||||
return 0
|
||||
if(!istype(M))
|
||||
return 0
|
||||
@@ -396,7 +396,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
|
||||
A.action = action
|
||||
A.target = source
|
||||
if(!alert_overlay)
|
||||
alert_overlay = new(src)
|
||||
alert_overlay = new(source)
|
||||
alert_overlay.layer = FLOAT_LAYER
|
||||
alert_overlay.plane = FLOAT_PLANE
|
||||
A.add_overlay(alert_overlay)
|
||||
|
||||
@@ -13,12 +13,6 @@
|
||||
stored_implants += IMP
|
||||
IMP.removed(src, 1, 1)
|
||||
|
||||
if (tr_flags & TR_KEEPORGANS)
|
||||
for(var/X in internal_organs)
|
||||
var/obj/item/organ/I = X
|
||||
int_organs += I
|
||||
I.Remove(src, 1)
|
||||
|
||||
var/list/missing_bodyparts_zones = get_missing_limbs()
|
||||
|
||||
var/obj/item/cavity_object
|
||||
@@ -92,10 +86,21 @@
|
||||
var/obj/item/weapon/implant/IMP = Y
|
||||
IMP.implant(O, null, 1)
|
||||
|
||||
//re-add organs to new mob
|
||||
//re-add organs to new mob. this order prevents moving the mind to a brain at any point
|
||||
if(tr_flags & TR_KEEPORGANS)
|
||||
for(var/X in O.internal_organs)
|
||||
qdel(X)
|
||||
var/obj/item/organ/I = X
|
||||
I.Remove(O, 1)
|
||||
|
||||
if(mind)
|
||||
mind.transfer_to(O)
|
||||
if(O.mind.changeling)
|
||||
O.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/humanform(null)
|
||||
|
||||
for(var/X in internal_organs)
|
||||
var/obj/item/organ/I = X
|
||||
int_organs += I
|
||||
I.Remove(src, 1)
|
||||
|
||||
for(var/X in int_organs)
|
||||
var/obj/item/organ/I = X
|
||||
@@ -118,7 +123,7 @@
|
||||
qdel(G) //we lose the organs in the missing limbs
|
||||
qdel(BP)
|
||||
|
||||
//transfer mind and delete old mob
|
||||
//transfer mind if we didn't yet
|
||||
if(mind)
|
||||
mind.transfer_to(O)
|
||||
if(O.mind.changeling)
|
||||
@@ -154,12 +159,6 @@
|
||||
stored_implants += IMP
|
||||
IMP.removed(src, 1, 1)
|
||||
|
||||
if (tr_flags & TR_KEEPORGANS)
|
||||
for(var/X in internal_organs)
|
||||
var/obj/item/organ/I = X
|
||||
int_organs += I
|
||||
I.Remove(src, 1)
|
||||
|
||||
var/list/missing_bodyparts_zones = get_missing_limbs()
|
||||
|
||||
var/obj/item/cavity_object
|
||||
@@ -244,7 +243,19 @@
|
||||
|
||||
if(tr_flags & TR_KEEPORGANS)
|
||||
for(var/X in O.internal_organs)
|
||||
qdel(X)
|
||||
var/obj/item/organ/I = X
|
||||
I.Remove(O, 1)
|
||||
|
||||
if(mind)
|
||||
mind.transfer_to(O)
|
||||
if(O.mind.changeling)
|
||||
for(var/obj/effect/proc_holder/changeling/humanform/HF in O.mind.changeling.purchasedpowers)
|
||||
mind.changeling.purchasedpowers -= HF
|
||||
|
||||
for(var/X in internal_organs)
|
||||
var/obj/item/organ/I = X
|
||||
int_organs += I
|
||||
I.Remove(src, 1)
|
||||
|
||||
for(var/X in int_organs)
|
||||
var/obj/item/organ/I = X
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
filedesc = "ID card modification program"
|
||||
program_icon_state = "id"
|
||||
extended_desc = "Program for programming employee ID cards to access parts of the station."
|
||||
transfer_access = GLOB.access_change_ids
|
||||
transfer_access = GLOB.access_heads
|
||||
requires_ntnet = 0
|
||||
size = 8
|
||||
var/mod_mode = 1
|
||||
@@ -452,7 +452,7 @@
|
||||
var/obj/item/weapon/card/id/auth_card = card_slot.stored_card2
|
||||
if(auth_card)
|
||||
region_access = list()
|
||||
if(transfer_access in auth_card.GetAccess())
|
||||
if(GLOB.access_change_ids in auth_card.GetAccess())
|
||||
minor = 0
|
||||
authenticated = 1
|
||||
return 1
|
||||
|
||||
@@ -497,9 +497,7 @@
|
||||
var/turf/T = get_turf(src)
|
||||
var/obj/structure/cable/N = T.get_cable_node()
|
||||
if (prob(50) && electrocute_mob(usr, N, N, 1, TRUE))
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
do_sparks(5, TRUE, src)
|
||||
return
|
||||
C.use(10)
|
||||
to_chat(user, "<span class='notice'>You add cables to the APC frame.</span>")
|
||||
@@ -1181,9 +1179,7 @@
|
||||
/obj/machinery/power/apc/proc/shock(mob/user, prb)
|
||||
if(!prob(prb))
|
||||
return 0
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
do_sparks(5, TRUE, src)
|
||||
if(isalien(user))
|
||||
return 0
|
||||
if(electrocute_mob(user, src, src, 1, TRUE))
|
||||
|
||||
@@ -156,9 +156,7 @@ By design, d1 is the smallest direction and d2 is the highest
|
||||
if(!prob(prb))
|
||||
return 0
|
||||
if (electrocute_mob(user, powernet, src, siemens_coeff))
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
do_sparks(5, TRUE, src)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
cold_circ = locate(circpath) in get_step(src, cold_dir)
|
||||
hot_circ = locate(circpath) in get_step(src, hot_dir)
|
||||
connect_to_network()
|
||||
SSair.atmos_machinery += src
|
||||
|
||||
if(cold_circ)
|
||||
switch(cold_dir)
|
||||
@@ -54,7 +55,10 @@
|
||||
stat |= BROKEN
|
||||
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/machinery/power/generator/Destroy()
|
||||
SSair.atmos_machinery -= src
|
||||
return ..()
|
||||
|
||||
/obj/machinery/power/generator/update_icon()
|
||||
|
||||
@@ -63,21 +67,20 @@
|
||||
else
|
||||
cut_overlays()
|
||||
|
||||
if(lastgenlev != 0)
|
||||
add_overlay("teg-op[lastgenlev]")
|
||||
var/L = min(round(lastgenlev/100000),11)
|
||||
if(L != 0)
|
||||
add_overlay(image('icons/obj/power.dmi', "teg-op[L]"))
|
||||
|
||||
add_overlay("teg-oc[lastcirc]")
|
||||
|
||||
|
||||
#define GENRATE 800 // generator output coefficient from Q
|
||||
|
||||
/obj/machinery/power/generator/process()
|
||||
/obj/machinery/power/generator/process_atmos()
|
||||
|
||||
if(!cold_circ || !hot_circ)
|
||||
return
|
||||
|
||||
lastgen = 0
|
||||
|
||||
if(powernet)
|
||||
//to_chat(world, "cold_circ and hot_circ pass")
|
||||
|
||||
@@ -104,7 +107,7 @@
|
||||
var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity)
|
||||
|
||||
var/heat = energy_transfer*(1-efficiency)
|
||||
lastgen = energy_transfer*efficiency
|
||||
lastgen += energy_transfer*efficiency
|
||||
|
||||
//to_chat(world, "lastgen = [lastgen]; heat = [heat]; delta_temperature = [delta_temperature]; hot_air_heat_capacity = [hot_air_heat_capacity]; cold_air_heat_capacity = [cold_air_heat_capacity];")
|
||||
|
||||
@@ -113,7 +116,7 @@
|
||||
|
||||
//to_chat(world, "POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]")
|
||||
|
||||
add_avail(lastgen)
|
||||
//add_avail(lastgen) This is done in process now
|
||||
// update icon overlays only if displayed level has changed
|
||||
|
||||
if(hot_air)
|
||||
@@ -123,15 +126,23 @@
|
||||
if(cold_air)
|
||||
var/datum/gas_mixture/cold_circ_air1 = cold_circ.AIR1
|
||||
cold_circ_air1.merge(cold_air)
|
||||
|
||||
update_icon()
|
||||
|
||||
var/genlev = max(0, min( round(11*lastgen / 100000), 11))
|
||||
var/circ = "[cold_circ && cold_circ.last_pressure_delta > 0 ? "1" : "0"][hot_circ && hot_circ.last_pressure_delta > 0 ? "1" : "0"]"
|
||||
if((genlev != lastgenlev) || (circ != lastcirc))
|
||||
lastgenlev = genlev
|
||||
if(circ != lastcirc)
|
||||
lastcirc = circ
|
||||
update_icon()
|
||||
|
||||
src.updateDialog()
|
||||
|
||||
/obj/machinery/power/generator/process()
|
||||
//Setting this number higher just makes the change in power output slower, it doesnt actualy reduce power output cause **math**
|
||||
var/power_output = round(lastgen / 10)
|
||||
add_avail(power_output)
|
||||
lastgenlev = power_output
|
||||
lastgen -= power_output
|
||||
..()
|
||||
|
||||
/obj/machinery/power/generator/attack_hand(mob/user)
|
||||
if(..())
|
||||
@@ -150,9 +161,15 @@
|
||||
var/datum/gas_mixture/hot_circ_air2 = hot_circ.AIR2
|
||||
|
||||
t += "<div class='statusDisplay'>"
|
||||
|
||||
t += "Output: [round(lastgen)] W"
|
||||
|
||||
|
||||
var/displaygen = lastgenlev
|
||||
if(displaygen < 1000000) //less than a MW
|
||||
displaygen /= 1000
|
||||
t += "Output: [round(displaygen,0.01)] kW"
|
||||
else
|
||||
displaygen /= 1000000
|
||||
t += "Output: [round(displaygen,0.01)] MW"
|
||||
|
||||
t += "<BR>"
|
||||
|
||||
t += "<B><font color='blue'>Cold loop</font></B><BR>"
|
||||
|
||||
@@ -303,17 +303,17 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
|
||||
use_power = on ? 2 : 1
|
||||
// Sound the alert if gravity was just enabled or disabled.
|
||||
var/alert = 0
|
||||
var/area/area = get_area(src)
|
||||
var/area/A = get_area(src)
|
||||
if(on && SSticker.IsRoundInProgress()) // If we turned on and the game is live.
|
||||
if(gravity_in_level() == 0)
|
||||
alert = 1
|
||||
investigate_log("was brought online and is now producing gravity for this level.", "gravity")
|
||||
message_admins("The gravity generator was brought online. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>[area.name]</a>)")
|
||||
message_admins("The gravity generator was brought online [A][ADMIN_COORDJMP(src)]")
|
||||
else
|
||||
if(gravity_in_level() == 1)
|
||||
alert = 1
|
||||
investigate_log("was brought offline and there is now no gravity for this level.", "gravity")
|
||||
message_admins("The gravity generator was brought offline with no backup generator. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>[area.name]</a>)")
|
||||
message_admins("The gravity generator was brought offline with no backup generator. [A][ADMIN_COORDJMP(src)]")
|
||||
|
||||
update_icon()
|
||||
update_list()
|
||||
|
||||
@@ -93,13 +93,15 @@
|
||||
connect_to_network()
|
||||
|
||||
sparks = new
|
||||
sparks.attach(src)
|
||||
sparks.set_up(5, TRUE, src)
|
||||
|
||||
/obj/machinery/power/emitter/Destroy()
|
||||
if(SSticker && SSticker.IsRoundInProgress())
|
||||
message_admins("Emitter deleted at ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
|
||||
log_game("Emitter deleted at ([x],[y],[z])")
|
||||
investigate_log("<font color='red'>deleted</font> at ([x],[y],[z]) at [get_area(src)]","singulo")
|
||||
var/turf/T = get_turf(src)
|
||||
message_admins("Emitter deleted at [ADMIN_COORDJMP(T)]",0,1)
|
||||
log_game("Emitter deleted at [COORD(T)]")
|
||||
investigate_log("<font color='red'>deleted</font> at [get_area(src)] [COORD(T)]","singulo")
|
||||
QDEL_NULL(sparks)
|
||||
return ..()
|
||||
|
||||
@@ -120,8 +122,8 @@
|
||||
if(src.active==1)
|
||||
src.active = 0
|
||||
to_chat(user, "<span class='notice'>You turn off \the [src].</span>")
|
||||
message_admins("Emitter turned off by [key_name_admin(user)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[user]'>FLW</A>) in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
|
||||
log_game("Emitter turned off by [key_name(user)] in ([x],[y],[z])")
|
||||
message_admins("Emitter turned off by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(src)]",0,1)
|
||||
log_game("Emitter turned off by [key_name(user)] in [COORD(src)]")
|
||||
investigate_log("turned <font color='red'>off</font> by [key_name(user)] at [get_area(src)]","singulo")
|
||||
else
|
||||
src.active = 1
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user