Teleporter has a cancel button.

Improved the admin player panel.
Disposals now work right with things thrown at them.
Nuke upgraded to use realtime.
This commit is contained in:
SkyMarshal
2012-02-28 13:39:51 -07:00
parent 90c976a8e4
commit 02002054de
9 changed files with 112 additions and 53 deletions

View File

@@ -103,7 +103,7 @@
// Cow
/mob/living/simple_animal/livestock/cow
name = "cow"
name = "\improper Cow"
icon_state = "cow"
icon_living = "cow"
icon_dead = "cow_d"
@@ -137,7 +137,7 @@
// Chicken
/mob/living/simple_animal/livestock/chicken
name = "chicken"
name = "\improper Chicken"
icon_state = "chick"
icon_living = "chick"
icon_dead = "chick_d"
@@ -163,7 +163,7 @@
desc = "Tasty!"
/obj/structure/closet/critter
desc = "A critter crate."
desc = "\improper Critter crate."
name = "Critter Crate"
icon = 'storage.dmi'
icon_state = "critter"
@@ -172,7 +172,7 @@
icon_closed = "critter"
/datum/supply_packs/chicken
name = "Chicken crate"
name = "\improper Chicken crate"
contains = list("/mob/living/simple_animal/livestock/chicken",
"/obj/item/weapon/reagent_containers/food/snacks/grown/corn")
cost = 10
@@ -181,7 +181,7 @@
group = "Hydroponics"
/datum/supply_packs/cow
name = "Cow crate"
name = "\improper Cow crate"
contains = list("/mob/living/simple_animal/livestock/cow",
"/obj/item/weapon/reagent_containers/food/snacks/grown/corn")
cost = 50

View File

@@ -1,8 +1,10 @@
/datum/event/power_offline
var/list/protected_areas = list(/area/ai_monitored/storage/eva, /area/engine, /area/toxins/xenobiology, /area/turret_protected/ai)
Announce()
for(var/obj/machinery/power/apc/a in world)
if(!a.crit && a.z == 1)
if(istype(a.area, /area/engine) || istype(a.area, /area/toxins/xenobiology) || istype(a.area, /area/turret_protected/ai))
if(a.area in protected_areas)
continue
a.eventoff = 1
a.update()

View File

@@ -6,7 +6,8 @@
density = 1
var/deployable = 0.0
var/extended = 0.0
var/timeleft = 60.0
var/timeleft = 1200
var/time_actual = 0
var/timing = 0.0
var/r_code = "ADMIN"
var/code = ""
@@ -22,8 +23,7 @@
/obj/machinery/nuclearbomb/process()
if (src.timing)
src.timeleft--
if (src.timeleft <= 0)
if((time_actual <= world.timeofday) && ((world.timeofday + (time_actual - world.timeofday)) <= 864000) )
explode()
for(var/mob/M in viewers(1, src))
if ((M.client && M.machine == src))
@@ -35,18 +35,23 @@
/obj/machinery/nuclearbomb/attack_hand(mob/user as mob)
if (src.extended)
var/time_left = time2text(time_actual-world.timeofday, "mm:ss")
if(world.timeofday + (time_actual - world.timeofday) >= 864000)
time_left = time2text(time_actual-(864000 - world.timeofday), "mm:ss")
if(!timing)
time_left = time2text(timeleft, "mm:ss")
user.machine = src
var/dat = text("<TT><B>Nuclear Fission Explosive</B><BR>\nAuth. Disk: <A href='?src=\ref[];auth=1'>[]</A><HR>", src, (src.auth ? "++++++++++" : "----------"))
if (src.auth)
if (src.yes_code)
dat += text("\n<B>Status</B>: []-[]<BR>\n<B>Timer</B>: []<BR>\n<BR>\nTimer: [] <A href='?src=\ref[];timer=1'>Toggle</A><BR>\nTime: <A href='?src=\ref[];time=-10'>-</A> <A href='?src=\ref[];time=-1'>-</A> [] <A href='?src=\ref[];time=1'>+</A> <A href='?src=\ref[];time=10'>+</A><BR>\n<BR>\nSafety: [] <A href='?src=\ref[];safety=1'>Toggle</A><BR>\nAnchor: [] <A href='?src=\ref[];anchor=1'>Toggle</A><BR>\n", (src.timing ? "Func/Set" : "Functional"), (src.safety ? "Safe" : "Engaged"), src.timeleft, (src.timing ? "On" : "Off"), src, src, src, src.timeleft, src, src, (src.safety ? "On" : "Off"), src, (src.anchored ? "Engaged" : "Off"), src)
dat += text("\n<B>Status</B>: []-[]<BR>\n<B>Timer</B>: []<BR>\n<BR>\nTimer: [] <A href='?src=\ref[];timer=1'>Toggle</A><BR>\nTime: <A href='?src=\ref[];time=-60'>-</A><A href='?src=\ref[];time=-10'>-</A><A href='?src=\ref[];time=-1'>-</A> [] <A href='?src=\ref[];time=1'>+</A><A href='?src=\ref[];time=10'>+</A><A href='?src=\ref[];time=60'>+</A><BR>\n<BR>\nSafety: [] <A href='?src=\ref[];safety=1'>Toggle</A><BR>\nAnchor: [] <A href='?src=\ref[];anchor=1'>Toggle</A><BR>\n", (src.timing ? "Func/Set" : "Functional"), (src.safety ? "Safe" : "Engaged"), time_left, (src.timing ? "On" : "Off"), src, src, src, src, time_left, src, src, src, (src.safety ? "On" : "Off"), src, (src.anchored ? "Engaged" : "Off"), src)
else
dat += text("\n<B>Status</B>: Auth. S2-[]<BR>\n<B>Timer</B>: []<BR>\n<BR>\nTimer: [] Toggle<BR>\nTime: - - [] + +<BR>\n<BR>\n[] Safety: Toggle<BR>\nAnchor: [] Toggle<BR>\n", (src.safety ? "Safe" : "Engaged"), src.timeleft, (src.timing ? "On" : "Off"), src.timeleft, (src.safety ? "On" : "Off"), (src.anchored ? "Engaged" : "Off"))
dat += text("\n<B>Status</B>: Auth. S2-[]<BR>\n<B>Timer</B>: []<BR>\n<BR>\nTimer: [] Toggle<BR>\nTime: - - [] + +<BR>\n<BR>\n[] Safety: Toggle<BR>\nAnchor: [] Toggle<BR>\n", (src.safety ? "Safe" : "Engaged"), time_left, (src.timing ? "On" : "Off"), time_left, (src.safety ? "On" : "Off"), (src.anchored ? "Engaged" : "Off"))
else
if (src.timing)
dat += text("\n<B>Status</B>: Set-[]<BR>\n<B>Timer</B>: []<BR>\n<BR>\nTimer: [] Toggle<BR>\nTime: - - [] + +<BR>\n<BR>\nSafety: [] Toggle<BR>\nAnchor: [] Toggle<BR>\n", (src.safety ? "Safe" : "Engaged"), src.timeleft, (src.timing ? "On" : "Off"), src.timeleft, (src.safety ? "On" : "Off"), (src.anchored ? "Engaged" : "Off"))
dat += text("\n<B>Status</B>: Set-[]<BR>\n<B>Timer</B>: []<BR>\n<BR>\nTimer: [] Toggle<BR>\nTime: - - [] + +<BR>\n<BR>\nSafety: [] Toggle<BR>\nAnchor: [] Toggle<BR>\n", (src.safety ? "Safe" : "Engaged"), time_left, (src.timing ? "On" : "Off"), time_left, (src.safety ? "On" : "Off"), (src.anchored ? "Engaged" : "Off"))
else
dat += text("\n<B>Status</B>: Auth. S1-[]<BR>\n<B>Timer</B>: []<BR>\n<BR>\nTimer: [] Toggle<BR>\nTime: - - [] + +<BR>\n<BR>\nSafety: [] Toggle<BR>\nAnchor: [] Toggle<BR>\n", (src.safety ? "Safe" : "Engaged"), src.timeleft, (src.timing ? "On" : "Off"), src.timeleft, (src.safety ? "On" : "Off"), (src.anchored ? "Engaged" : "Off"))
dat += text("\n<B>Status</B>: Auth. S1-[]<BR>\n<B>Timer</B>: []<BR>\n<BR>\nTimer: [] Toggle<BR>\nTime: - - [] + +<BR>\n<BR>\nSafety: [] Toggle<BR>\nAnchor: [] Toggle<BR>\n", (src.safety ? "Safe" : "Engaged"), time_left, (src.timing ? "On" : "Off"), time_left, (src.safety ? "On" : "Off"), (src.anchored ? "Engaged" : "Off"))
var/message = "AUTH"
if (src.auth)
message = text("[]", src.code)
@@ -111,17 +116,22 @@
if (src.yes_code)
if (href_list["time"])
var/time = text2num(href_list["time"])
src.timeleft += time
src.timeleft = min(max(round(src.timeleft), 5), 600)
timeleft = min(max(time + (timeleft/10), 120), 900) * 10
if (href_list["timer"])
if (src.timing == -1.0)
if (timing == -1.0)
return
src.timing = !( src.timing )
if (src.timing)
timing = !( timing )
if (timing)
time_actual = world.timeofday + timeleft
if(time_actual >= 864000)
time_actual -= 864000
src.icon_state = "nuclearbomb2"
if(!src.safety)
bomb_set = 1//There can still be issues with this reseting when there are multiple bombs. Not a big deal tho for Nuke/N
else
timeleft = time_actual - world.timeofday
if(timeleft < 0)
timeleft += 864000
src.icon_state = "nuclearbomb1"
bomb_set = 0
if (href_list["safety"])
@@ -153,6 +163,7 @@
/obj/machinery/nuclearbomb/proc/explode()
if (src.safety)
src.timing = 0
timeleft = 0
return
src.timing = -1.0
src.yes_code = 0

View File

@@ -394,7 +394,7 @@ var
var/J = job
var/rendered = "[part_a][N][part_b][quotedmsg][part_c]"
for (var/mob/R in heard_masked)
if(istype(R, /mob/living/silicon/ai))
if(istype(R, /mob/living/silicon/ai) && job != "Automated Announcement")
R.show_message("[part_a]<a href='byond://?src=\ref[radio];track2=\ref[R];track=\ref[M]'>[N] ([J]) </a>[part_b][quotedmsg][part_c]", 2)
else
R.show_message(rendered, 2)
@@ -405,7 +405,7 @@ var
var/rendered = "[part_a][M.real_name][part_b][quotedmsg][part_c]"
for (var/mob/R in heard_normal)
if(istype(R, /mob/living/silicon/ai))
if(istype(R, /mob/living/silicon/ai) && job != "Automated Announcement")
R.show_message("[part_a]<a href='byond://?src=\ref[radio];track2=\ref[R];track=\ref[M]'>[realname] ([job]) </a>[part_b][quotedmsg][part_c]", 2)
else
R.show_message(rendered, 2)
@@ -419,7 +419,7 @@ var
rendered = "[part_a][vname][part_b][M.voice_message][part_c]"
for (var/mob/R in heard_voice)
if(istype(R, /mob/living/silicon/ai))
if(istype(R, /mob/living/silicon/ai) && job != "Automated Announcement")
R.show_message("[part_a]<a href='byond://?src=\ref[radio];track2=\ref[R];track=\ref[M]'>[vname] ([job]) </a>[part_b][vmessage]][part_c]", 2)
else
R.show_message(rendered, 2)
@@ -435,7 +435,7 @@ var
var/rendered = "[part_a][vname][part_b][quotedmsg][part_c]"
for (var/mob/R in heard_garbled)
if(istype(R, /mob/living/silicon/ai))
if(istype(R, /mob/living/silicon/ai) && job != "Automated Announcement")
R.show_message("[part_a]<a href='byond://?src=\ref[radio];track2=\ref[R];track=\ref[M]'>[vname]</a>[part_b][quotedmsg][part_c]", 2)
else
R.show_message(rendered, 2)

View File

@@ -83,10 +83,11 @@
areaindex[tmpname] = 1
L[tmpname] = I
var/desc = input("Please select a location to lock in.", "Locking Computer") in L
src.locked = L[desc]
for(var/mob/O in hearers(src, null))
O.show_message("\blue Locked In", 2)
var/desc = input("Please select a location to lock in.", "Locking Computer") in L|null
if(desc)
src.locked = L[desc]
for(var/mob/O in hearers(src, null))
O.show_message("\blue Locked In", 2)
src.add_fingerprint(usr)
return

View File

@@ -232,7 +232,7 @@ var/specops_shuttle_timeleft = 0
if(specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom)
return 0
for(var/obj/machinery/computer/specops_shuttle/S in world)
if(world.time <= S.specops_shuttle_timereset)
if(world.timeofday <= S.specops_shuttle_timereset)
return 0
return 1
@@ -286,10 +286,10 @@ var/specops_shuttle_timeleft = 0
if (!specops_can_move())
usr << "\blue Central Command will not allow the Special Operations shuttle to return yet."
if(world.time <= specops_shuttle_timereset)
if (((world.time - specops_shuttle_timereset)/10) > 60)
usr << "\blue [-((world.time - specops_shuttle_timereset)/10)/60] minutes remain!"
usr << "\blue [-(world.time - specops_shuttle_timereset)/10] seconds remain!"
if(world.timeofday <= specops_shuttle_timereset)
if (((world.timeofday - specops_shuttle_timereset)/10) > 60)
usr << "\blue [-((world.timeofday - specops_shuttle_timereset)/10)/60] minutes remain!"
usr << "\blue [-(world.timeofday - specops_shuttle_timereset)/10] seconds remain!"
return
usr << "\blue The Special Operations shuttle will arrive at Central Command in [(SPECOPS_MOVETIME/10)] seconds."

View File

@@ -258,11 +258,16 @@
if ((M.client && M.client.holder && (M.client.holder.level >= src.level)))
alert("You cannot perform this action. You must be of a higher administrative rank!", null, null, null, null, null)
return
M << "\red You have been kicked from the server"
log_admin("[key_name(usr)] booted [key_name(M)].")
message_admins("\blue [key_name_admin(usr)] booted [key_name_admin(M)].", 1)
//M.client = null
del(M.client)
switch(alert("Are you sure?", ,"Yes", "NO, WAIT.. DAMMIT! NOT THAT BUTTON!"))
if("Yes")
if(ismob(M))
M << "\red You have been kicked from the server"
log_admin("[key_name(usr)] booted [key_name(M)].")
message_admins("\blue [key_name_admin(usr)] booted [key_name_admin(M)].", 1)
//M.client = null
del(M.client)
else
src << "Looks like someone already beat you."
if (href_list["removejobban"])
if ((src.rank in list("Game Admin", "Game Master" )))
@@ -1759,6 +1764,36 @@
C.files.RefreshResearch()
owner:rnd_check_designs()
#define AUTOBANTIME 10
if(href_list["warn"])
var/mob/M = locate(href_list["warn"])
if (ismob(M))
var/client/user
if(istype(usr, /client))
user = usr
else if(istype(usr, /mob))
user = usr.client
if(!user.holder)
src << "Only administrators may use this command."
return
if(M.client && M.client.holder && (M.client.holder.level >= user.holder.level))
alert("You cannot perform this action. You must be of a higher administrative rank!", null, null, null, null, null)
return
if(!M.client.warned)
M << "\red <B>You have been warned by an administrator. This is the only warning you will recieve.</B>"
M.client.warned = 1
message_admins("\blue [user.ckey] warned [M.ckey].")
else
AddBan(M.ckey, M.computer_id, "Autobanning due to previous warn", user.ckey, 1, AUTOBANTIME)
M << "\red<BIG><B>You have been autobanned by [user.ckey]. This is what we in the biz like to call a \"second warning\".</B></BIG>"
M << "\red This is a temporary ban; it will automatically be removed in [AUTOBANTIME] minutes."
log_admin("[user.ckey] warned [M.ckey], resulting in a [AUTOBANTIME] minute autoban.")
ban_unban_log_save("[user.ckey] warned [M.ckey], resulting in a [AUTOBANTIME] minute autoban.")
message_admins("\blue [user.ckey] warned [M.ckey], resulting in a [AUTOBANTIME] minute autoban.")
feedback_inc("ban_warn",1)
del(M.client)
///////////////////////////////////////////////////////////////////////////////////////////////Panels

View File

@@ -11,6 +11,7 @@
for(var/mob/M in mobs)
if(M.ckey)
var/color = "#e6e6e6"
i++
if(i%2 == 0)
color = "#f2f2f2"
var/real = (M.real_name == M.original_name ? M.real_name : "[M.original_name] (as [M.real_name])")
@@ -19,26 +20,32 @@
dat += "<tr align='center' bgcolor='[color]'><td>[M.name] \[[real]\] <br>[M.client ? M.client : "No client ([client_key])"] at ([T.x], [T.y], [T.z])</td>" // Adds current name
if(isobserver(M))
dat += "<td>Ghost</td>"
if(isalien(M))
else if(isalien(M))
dat += "<td>Alien</td>"
if(islarva(M))
else if(islarva(M))
dat += "<td>Alien larva</td>"
if(ishuman(M))
else if(istajaran(M))
dat += "<td>Tajaran</td>"
else if(ishuman(M))
dat += "<td>[M.job]</td>"
if(ismetroid(M))
else if(ismetroid(M))
dat += "<td>Metroid</td>"
if(ismonkey(M))
else if(ismonkey(M))
dat += "<td>Monkey</td>"
if(isAI(M))
else if(isAI(M))
dat += "<td>AI</td>"
if(ispAI(M))
else if(ispAI(M))
dat += "<td>pAI</td>"
if(isrobot(M))
else if(isrobot(M))
dat += "<td>Cyborg</td>"
if(isanimal(M))
else if(isanimal(M))
dat += "<td>Animal</td>"
if(iscorgi(M))
else if(iscorgi(M))
dat += "<td>Corgi</td>"
else if(istype(M,/mob/new_player))
dat += "<td>New Player</td>"
else
dat += "<td>ERROR</td>"
if(M.mind && M.mind.assigned_role && istype(M, /mob/living/carbon/human)) // Adds a column to Player Panel that shows their current job.
var/mob/living/carbon/human/H = M
@@ -81,13 +88,14 @@
"}
dat += {"<td><A HREF='?src=\ref[src];player_info=[M.ckey]'>[player_has_info(M.ckey) ? "Info" : "N/A"] </A></td>
<td><A href='?src=\ref[src];boot2=\ref[M]'>Boot</A> | <A href='?src=\ref[src];newban=\ref[M]'>Ban</A> | <A href='?src=\ref[src];jobban2=\ref[M]'>Jobban</A>
<br><font size="2.5">[muting]</font><br>
<font size="2"><A HREF='?src=\ref[src];adminplayeropts=\ref[M]'>PP</A> |
<td><A href='?src=\ref[usr];priv_msg=\ref[M]'><b>PM</b></A> |
<A HREF='?src=\ref[src];adminplayeropts=\ref[M]'>PP</A> |
<A HREF='?src=\ref[src];adminplayervars=\ref[M]'>VV</A> |
<A HREF='?src=\ref[src];adminplayersubtlemessage=\ref[M]'>SM</A> |
<A HREF='?src=\ref[src];adminplayerobservejump=\ref[M]'>JMP</A> |
<A HREF='?src=\ref[src];secretsadmin=check_antagonist'>CA</A></font></td>
<A HREF='?src=\ref[src];secretsadmin=check_antagonist'>CA</A></font>
<br><font size="2">[muting]</font><br>
<font size="2"><A href='?src=\ref[src];warn=\ref[M]'>Warn</A> | <A href='?src=\ref[src];boot2=\ref[M]'>Boot</A> | <A href='?src=\ref[src];newban=\ref[M]'>Ban</A> | <A href='?src=\ref[src];jobban2=\ref[M]'>Jobban</A></td>
"}
switch(is_special_character(M))
@@ -100,7 +108,7 @@
dat += "</table></body></html>"
usr << browse(dat, "window=players;size=905x480")
usr << browse(dat, "window=players;size=905x600")
//The old one
/obj/admins/proc/player_panel_old()

View File

@@ -439,8 +439,10 @@
del(H)
CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if (istype(mover,/obj/item) && !istype(mover,/obj/item/weapon/dummy))
if (istype(mover,/obj/item))
var/obj/item/I = mover
if(!mover.throwing)
return ..()
if(prob(75))
I.loc = src
for(var/mob/M in viewers(src))
@@ -450,7 +452,7 @@
M.show_message("\the [I] bounces off of \the [src]'s rim!", 3)
return 0
else
return ..(mover, target, height, air_group)
return ..()
//The toilet does not need to pressurized but can only handle small items.
//You can also choke people by dunking them into the toilet.