From 04f0a798664cd22e6b4cb6387d469cff1edb12ca Mon Sep 17 00:00:00 2001 From: "elly1989@rocketmail.com" Date: Thu, 12 Apr 2012 21:54:51 +0000 Subject: [PATCH] Rewrote blackholes (gravitational anomalies) and wormholes to try and optimise them a little. If you have any concerns about how I've done so just give me a shout and I'll either rework them or revert my changes back. Wormholes especially seem a bit faster on my laptop. Smoke has temporarily been removed from the blackhole event until I get time to investigate why the hell effect_systems are using so much memory ( spark effects were using 40% of my processor a second ago D: ). To compensate this I made them a new sprite. Commented out the authentication system. It was the remnants of the old goon authentication stuff (or maybe even older) and wasn't actually used in our code at all (at least not in any useful way, it was merely called and short-circuited to 1, so all those if(authenticated) were totally pointless. This has removed 3 unused variables from every client, a bunch of unused variables from the config and two empty text files! Committed (as a config option) a feature requested by Apoc station. It causes a 'reply to' window to popup when an admin PMs a non-admin player. It's meant to grab their attention so they can't say "I didn't see your PM". It defaults to off. To turn it on just uncomment the #POPUP_ADMIN_PM line in config/config.txt Fixed a derp in isday where it was fetching the month instead of the day. Removed medal references from Gib() Removed the medal_hub global variables because they aren't used in any way shape or form. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@3444 316c924e-a436-60f5-8080-3fe189b3f50e --- code/WorkInProgress/mapload/reader.dm | 2 +- code/datums/configuration.dm | 23 ++- code/defines/client.dm | 6 +- code/defines/global.dm | 2 - code/defines/obj/storage.dm | 10 +- code/defines/procs/statistics.dm | 2 +- code/defines/procs/time_stamp.dm | 3 +- code/game/cellautomata.dm | 2 - code/game/gamemodes/events/black_hole.dm | 141 +++++++++--------- code/game/gamemodes/events/space_ninja.dm | 2 +- code/game/gamemodes/events/wormholes.dm | 63 ++++++++ code/game/gamemodes/sandbox/sandbox.dm | 2 +- code/game/machinery/bots/mulebot.dm | 9 -- code/game/magic/cultist/ritual.dm | 2 +- code/game/magic/cultist/runes.dm | 22 +-- code/game/topic.dm | 2 +- code/game/verbs/authorize.dm | 2 + code/game/verbs/ooc.dm | 12 +- code/game/verbs/who.dm | 26 +--- code/game/vote.dm | 5 +- code/modules/admin/admin.dm | 62 +++----- code/modules/admin/admin_verbs.dm | 6 +- code/modules/admin/verbs/adminhelp.dm | 3 - code/modules/admin/verbs/adminjump.dm | 16 +- code/modules/admin/verbs/adminsay.dm | 8 +- code/modules/admin/verbs/atmosdebug.dm | 2 +- code/modules/admin/verbs/deadsay.dm | 2 +- code/modules/admin/verbs/debug.dm | 4 +- code/modules/admin/verbs/diagnostics.dm | 4 +- code/modules/admin/verbs/massmodvar.dm | 2 +- code/modules/admin/verbs/modifyvariables.dm | 2 +- code/modules/admin/verbs/playsound.dm | 6 +- code/modules/admin/verbs/pray.dm | 3 - code/modules/admin/verbs/randomverbs.dm | 83 ++++++----- code/modules/admin/verbs/striketeam.dm | 2 +- .../admin/verbs/striketeam_syndicate.dm | 2 +- code/modules/admin/verbs/ticklag.dm | 2 +- code/modules/mob/living/blob/blob.dm | 2 +- .../living/carbon/alien/humanoid/humanoid.dm | 4 +- .../mob/living/carbon/alien/larva/larva.dm | 4 +- code/modules/mob/living/carbon/carbon.dm | 4 +- code/modules/mob/living/carbon/human/human.dm | 4 +- .../mob/living/carbon/monkey/monkey.dm | 4 +- code/modules/mob/living/silicon/robot/life.dm | 2 +- .../modules/mob/living/silicon/robot/robot.dm | 7 +- code/modules/mob/mob.dm | 6 +- code/modules/mob/new_player/new_player.dm | 10 -- code/modules/power/antimatter/fuel.dm | 2 +- code/stylesheet.dm | 30 +--- config/config.txt | 6 +- icons/obj/objects.dmi | Bin 88384 -> 95654 bytes tgstation.dme | 2 +- 52 files changed, 315 insertions(+), 319 deletions(-) create mode 100644 code/game/gamemodes/events/wormholes.dm diff --git a/code/WorkInProgress/mapload/reader.dm b/code/WorkInProgress/mapload/reader.dm index 57b76a4bd8c..755b96fc2da 100644 --- a/code/WorkInProgress/mapload/reader.dm +++ b/code/WorkInProgress/mapload/reader.dm @@ -158,7 +158,7 @@ dmm_suite/preloader set name = "LoadMap" set desc = "Loads a map" set hidden = 1 - if(src.authenticated && src.holder) + if(src.holder) if(!src.mob) return if(src.holder.rank in list("Game Admin", "Game Master")) diff --git a/code/datums/configuration.dm b/code/datums/configuration.dm index d1fc6c29bd2..a7d03508502 100644 --- a/code/datums/configuration.dm +++ b/code/datums/configuration.dm @@ -2,9 +2,6 @@ var/server_name = null // server name (for world name / status) var/server_suffix = 0 // generate numeric suffix based on server port - var/medal_hub = null // medal hub name - var/medal_password = null // medal hub password - var/log_ooc = 0 // log OOC channek var/log_access = 0 // log login/logout var/log_say = 0 // log client say @@ -27,13 +24,14 @@ var/vote_period = 60 // length of voting period (seconds, default 1 minute) var/vote_no_default = 0 // vote does not default to nochange/norestart (tbi) var/vote_no_dead = 0 // dead people can't vote (tbi) - var/enable_authentication = 0 // goon authentication +// var/enable_authentication = 0 // goon authentication var/del_new_on_log = 1 // del's new players if they log before they spawn in var/feature_object_spell_system = 0 //spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard - var/traitor_scaling = 0 //if amount of traitors scales based on amount of players + var/traitor_scaling = 0 //if amount of traitors scales based on amount of players var/protect_roles_from_antagonist = 0// If security and such can be tratior/cult/other var/Tensioner_Active = 0 // If the tensioner is running. - var/allow_Metadata = 0 // Metadata is suported. + var/allow_Metadata = 0 // Metadata is supported. + var/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1. var/list/mode_names = list() var/list/modes = list() // allowed modes @@ -195,8 +193,8 @@ if ("allow_ai") config.allow_ai = 1 - if ("authentication") - config.enable_authentication = 1 +// if ("authentication") +// config.enable_authentication = 1 if ("norespawn") config.respawn = 0 @@ -207,12 +205,6 @@ if ("serversuffix") config.server_suffix = 1 - if ("medalhub") - config.medal_hub = value - - if ("medalpass") - config.medal_password = value - if ("hostedby") config.hostedby = value @@ -288,6 +280,9 @@ if("forbid_singulo_possession") forbid_singulo_possession = 1 + if("popup_admin_pm") + config.popup_admin_pm = 1 + if("useircbot") useircbot = 1 diff --git a/code/defines/client.dm b/code/defines/client.dm index bc2c682ac6b..db41303a687 100644 --- a/code/defines/client.dm +++ b/code/defines/client.dm @@ -15,9 +15,9 @@ //END Admin Things //Key auth things - authenticate = 0 - var/authenticated = 0 - var/authenticating = 0 +// authenticate = 0 +// var/authenticated = 0 +// var/authenticating = 0 var/listen_ooc = 1 var/move_delay = 1 diff --git a/code/defines/global.dm b/code/defines/global.dm index 89a353973b7..77bcf63a7ee 100644 --- a/code/defines/global.dm +++ b/code/defines/global.dm @@ -133,9 +133,7 @@ var shuttlecoming = 0 join_motd = null - auth_motd = null rules = null - no_auth_motd = null forceblob = 0 //airlockWireColorToIndex takes a number representing the wire color, e.g. the orange wire is always 1, the dark red wire is always 2, etc. It returns the index for whatever that wire does. diff --git a/code/defines/obj/storage.dm b/code/defines/obj/storage.dm index 50ba6fdd04e..8603cf88a86 100644 --- a/code/defines/obj/storage.dm +++ b/code/defines/obj/storage.dm @@ -233,27 +233,27 @@ icon_state = "firstaid" /obj/item/weapon/storage/syringes - name = "Syringes" + name = "syringes" desc = "A box full of syringes." desc = "A biohazard alert warning is printed on the box" icon_state = "syringe" foldable = /obj/item/stack/sheet/cardboard //BubbleWrap /obj/item/weapon/storage/firstaid/toxin - name = "Toxin First Aid" + name = "toxin first aid" desc = "Used to treat when you have a high amoutn of toxins in your body." icon_state = "antitoxin" item_state = "firstaid-toxin" /obj/item/weapon/storage/firstaid/o2 - name = "Oxygen Deprivation First Aid" + name = "oxygen deprivation first aid" desc = "A box full of oxygen goodies." icon_state = "o2" item_state = "firstaid-o2" /obj/item/weapon/storage/flashbang_kit - name = "Flashbangs (WARNING)" - desc = "WARNING: Do not use without reading these preautions!\nThese devices are extremely dangerous and can cause blindness or deafness if used incorrectly.\nThe chemicals contained in these devices have been tuned for maximal effectiveness and due to\nextreme safety precuaiotn shave been incased in a tamper-proof pack. DO NOT ATTEMPT TO OPEN\nFLASH WARNING: Do not use continually. Excercise extreme care when detonating in closed spaces.\n\tMake attemtps not to detonate withing range of 2 meters of the intended target. It is imperative\n\tthat the targets visit a medical professional after usage. Damage to eyes increases extremely per\n\tuse and according to range. Glasses with flash resistant filters DO NOT always work on high powered\n\tflash devices such as this. EXERCISE CAUTION REGARDLESS OF CIRCUMSTANCES\nSOUND WARNING: Do not use continually. Visit a medical professional if hearing is lost.\n\tThere is a slight chance per use of complete deafness. Exercise caution and restraint.\nSTUN WARNING: If the intended or unintended target is too close to detonation the resulting sound\n\tand flash have been known to cause extreme sensory overload resulting in temporary\n\tincapacitation.\nDO NOT USE CONTINUALLY\nOperating Directions:\n\t1. Pull detonnation pin. ONCE THE PIN IS PULLED THE GRENADE CAN NOT BE DISARMED!\n\t2. Throw grenade. NEVER HOLD A LIVE FLASHBANG\n\t3. The grenade will detonste 10 seconds hafter being primed. EXCERCISE CAUTION\n\t-Never prime another grenade until after the first is detonated\nNote: Usage of this pyrotechnic device without authorization is an extreme offense and can\nresult in severe punishment upwards of 10 years in prison per use.\n\nDefault 3 second wait till from prime to detonation. This can be switched with a screwdriver\nto 10 seconds.\n\nCopyright of Nanotrasen Industries- Military Armnaments Division\nThis device was created by Nanotrasen Labs a member of the Expert Advisor Corporation" + name = "flashbangs (WARNING)" + desc = "" icon_state = "flashbang" item_state = "syringe_kit" foldable = /obj/item/stack/sheet/cardboard //BubbleWrap diff --git a/code/defines/procs/statistics.dm b/code/defines/procs/statistics.dm index b1f8d8816ca..08183aaf17f 100644 --- a/code/defines/procs/statistics.dm +++ b/code/defines/procs/statistics.dm @@ -23,7 +23,7 @@ proc/sql_poll_admins() return var/admincount = 0 for (var/mob/M in world) - if(M && M.client && M.client.holder && M.client.authenticated) + if(M && M.client && M.client.holder) admincount += 1 var/DBConnection/dbcon = new() dbcon.Connect("dbi:mysql:[sqldb]:[sqladdress]:[sqlport]","[sqllogin]","[sqlpass]") diff --git a/code/defines/procs/time_stamp.dm b/code/defines/procs/time_stamp.dm index d966a6c685a..e9e72a95636 100644 --- a/code/defines/procs/time_stamp.dm +++ b/code/defines/procs/time_stamp.dm @@ -15,7 +15,7 @@ proc/time_stamp() proc/isDay(var/month, var/day) if(isnum(month) && isnum(day)) var/MM = text2num(time2text(world.timeofday, "MM")) // get the current month - var/DD = text2num(time2text(world.timeofday, "MM")) // get the current day + var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day if(month == MM && day == DD) return 1 @@ -26,4 +26,3 @@ proc/isDay(var/month, var/day) /* Check if it's april fools day */ proc/isAprilFools() return isDay(4, 1) - diff --git a/code/game/cellautomata.dm b/code/game/cellautomata.dm index 1d4e328131f..17204286693 100644 --- a/code/game/cellautomata.dm +++ b/code/game/cellautomata.dm @@ -13,8 +13,6 @@ /world/proc/load_motd() join_motd = file2text("config/motd.txt") - auth_motd = file2text("config/motd-auth.txt") - no_auth_motd = file2text("config/motd-noauth.txt") /world/proc/load_rules() rules = file2text("config/rules.html") diff --git a/code/game/gamemodes/events/black_hole.dm b/code/game/gamemodes/events/black_hole.dm index 4320e444e84..23de4b1c050 100644 --- a/code/game/gamemodes/events/black_hole.dm +++ b/code/game/gamemodes/events/black_hole.dm @@ -2,86 +2,87 @@ name = "black hole" icon = 'objects.dmi' desc = "FUCK FUCK FUCK AAAHHH" - icon_state = "bhole2" - opacity = 0 + icon_state = "bhole3" + opacity = 1 unacidable = 1 density = 0 anchored = 1 - var/datum/effect/effect/system/harmless_smoke_spread/smoke - /obj/effect/bhole/New() - src.smoke = new /datum/effect/effect/system/harmless_smoke_spread() - src.smoke.set_up(5, 0, src) - src.smoke.attach(src) - src:life() + spawn(4) + controller() + +/obj/effect/bhole/proc/controller() + while(src) + + if(!isturf(loc)) + del(src) + return + + //DESTROYING STUFF AT THE EPICENTER + for(var/mob/living/M in orange(1,src)) + del(M) + for(var/obj/O in orange(1,src)) + del(O) + for(var/turf/simulated/ST in orange(1,src)) + ST.ReplaceWithSpace() + + sleep(6) + grav(10, 4, 10, 0 ) + sleep(6) + grav( 8, 4, 10, 0 ) + sleep(6) + grav( 9, 4, 10, 0 ) + sleep(6) + grav( 7, 3, 40, 1 ) + sleep(6) + grav( 5, 3, 40, 1 ) + sleep(6) + grav( 6, 3, 40, 1 ) + sleep(6) + grav( 4, 2, 50, 6 ) + sleep(6) + grav( 3, 2, 50, 6 ) + sleep(6) + grav( 2, 2, 75,25 ) + sleep(6) -/obj/effect/bhole/Bumped(atom/A) - if (istype(A,/mob/living)) - del(A) - else - A:ex_act(1.0) - -/obj/effect/bhole/proc/life() //Oh man , this will LAG - - if (prob(10)) - src.anchored = 0 - step(src,pick(alldirs)) - if (prob(30)) + //MOVEMENT + if( prob(50) ) + src.anchored = 0 step(src,pick(alldirs)) - src.anchored = 1 + src.anchored = 1 - for (var/atom/X in orange(9,src)) - if ((istype(X,/obj) || istype(X,/mob/living)) && prob(7)) - if (!X:anchored) - step_towards(X,src) +/obj/effect/bhole/proc/grav(var/r, var/ex_act_force, var/pull_chance, var/turf_removal_chance) + if(!isturf(loc)) //blackhole cannot be contained inside anything. Weird stuff might happen + del(src) + return + for(var/t = -r, t < r, t++) + affect_coord(x+t, y-r, ex_act_force, pull_chance, turf_removal_chance) + affect_coord(x-t, y+r, ex_act_force, pull_chance, turf_removal_chance) + affect_coord(x+r, y+t, ex_act_force, pull_chance, turf_removal_chance) + affect_coord(x-r, y-t, ex_act_force, pull_chance, turf_removal_chance) + return - for (var/atom/B in orange(7,src)) - if (istype(B,/obj)) - if (!B:anchored && prob(50)) - step_towards(B,src) - if(prob(10)) B:ex_act(3.0) +/obj/effect/bhole/proc/affect_coord(var/x, var/y, var/ex_act_force, var/pull_chance, var/turf_removal_chance) + //Get turf at coordinate + var/turf/T = locate(x, y, z) + if(isnull(T)) return + + //Pulling and/or ex_act-ing movable atoms in that turf + if( prob(pull_chance) ) + for(var/obj/O in T.contents) + if(O.anchored) + O.ex_act(ex_act_force) else - B:anchored = 0 - //step_towards(B,src) - //B:anchored = 1 - if(prob(10)) B:ex_act(3.0) - else if (istype(B,/turf)) - if (istype(B,/turf/simulated) && (prob(1) && prob(75))) - src.smoke.start() - B:ReplaceWithSpace() - else if (istype(B,/mob/living)) - step_towards(B,src) + step_towards(O,src) + for(var/mob/living/M in T.contents) + step_towards(M,src) - - for (var/atom/A in orange(4,src)) - if (istype(A,/obj)) - if (!A:anchored && prob(90)) - step_towards(A,src) - if(prob(30)) A:ex_act(2.0) - else - A:anchored = 0 - //step_towards(A,src) - //A:anchored = 1 - if(prob(30)) A:ex_act(2.0) - else if (istype(A,/turf)) - if (istype(A,/turf/simulated) && prob(1)) - src.smoke.start() - A:ReplaceWithSpace() - else if (istype(A,/mob/living)) - step_towards(A,src) - - - for (var/atom/D in orange(1,src)) - //if (hascall(D,"blackholed")) - // call(D,"blackholed")(null) - // continue - if (istype(D,/mob/living)) - del(D) - else - D:ex_act(1.0) - - spawn(17) - life() \ No newline at end of file + //Destroying the turf + if( T && istype(T,/turf/simulated) && prob(turf_removal_chance) ) + var/turf/simulated/ST = T + ST.ReplaceWithSpace() + return \ No newline at end of file diff --git a/code/game/gamemodes/events/space_ninja.dm b/code/game/gamemodes/events/space_ninja.dm index e7ffe922c50..de354bd3d56 100644 --- a/code/game/gamemodes/events/space_ninja.dm +++ b/code/game/gamemodes/events/space_ninja.dm @@ -396,7 +396,7 @@ As such, it's hard-coded for now. No reason for it not to be, really. set desc = "Spawns a space ninja for when you need a teenager with attitude." set popup_menu = 0 - if(!authenticated || !holder) + if(!holder) src << "Only administrators may use this command." return if(!ticker.mode) diff --git a/code/game/gamemodes/events/wormholes.dm b/code/game/gamemodes/events/wormholes.dm new file mode 100644 index 00000000000..7036a0cd16b --- /dev/null +++ b/code/game/gamemodes/events/wormholes.dm @@ -0,0 +1,63 @@ +/proc/wormhole_event() + spawn() + var/list/pick_turfs = list() + for(var/turf/simulated/floor/T in world) + if(T.z == 1) + pick_turfs += T + + if(pick_turfs.len) + //All ready. Announce that bad juju is afoot. + command_alert("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert") + world << sound('spanomalies.ogg') + + //prob(20) can be approximated to 1 wormhole every 5 turfs! + //admittedly less random but totally worth it >_< + var/event_duration = 3000 //~5 minutes in ticks + var/number_of_selections = (pick_turfs.len/5)+1 //+1 to avoid division by zero! + var/sleep_duration = round( event_duration / number_of_selections ) + var/end_time = world.time + event_duration //the time by which the event should have ended + + var/increment = max(1,round(number_of_selections/50)) + world << "DEBUG: number_of_selections: [number_of_selections] | sleep_duration: [sleep_duration]" + + var/i = 1 + while( 1 ) + + //we've run into overtime. End the event + if( end_time < world.time ) + world << "DEBUG: we've run into overtime. End the event" + return + if( !pick_turfs.len ) + world << "DEBUG: we've run out of turfs to pick. End the event" + return + + //loop it round + i += increment + i %= pick_turfs.len + i++ + + //get our enter and exit locations + var/turf/simulated/floor/enter = pick_turfs[i] + pick_turfs -= enter //remove it from pickable turfs list + if( !enter || !istype(enter) ) continue //sanity + + var/turf/simulated/floor/exit = pick(pick_turfs) + pick_turfs -= exit + if( !exit || !istype(exit) ) continue //sanity + + create_wormhole(enter,exit) + + sleep(sleep_duration) //have a well deserved nap! + + +//maybe this proc can even be used as an admin tool for teleporting players without ruining immulsions? +/proc/create_wormhole(var/turf/enter as turf, var/turf/exit as turf) + var/obj/effect/portal/P = new /obj/effect/portal( enter ) + P.target = exit + P.creator = null + P.icon = 'objects.dmi' + P.failchance = 0 + P.icon_state = "anom" + P.name = "wormhole" + spawn(rand(300,600)) + del(P) \ No newline at end of file diff --git a/code/game/gamemodes/sandbox/sandbox.dm b/code/game/gamemodes/sandbox/sandbox.dm index cd2f20335c0..668c58dab93 100644 --- a/code/game/gamemodes/sandbox/sandbox.dm +++ b/code/game/gamemodes/sandbox/sandbox.dm @@ -12,7 +12,7 @@ /datum/game_mode/sandbox/pre_setup() for(var/mob/M in world) - if(M.client && M.client.authenticated) + if(M.client) M.CanBuild() setup_sectors() diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm index 7197649b346..33098ad8fe7 100644 --- a/code/game/machinery/bots/mulebot.dm +++ b/code/game/machinery/bots/mulebot.dm @@ -787,15 +787,6 @@ src.visible_message("\red [src] drives over [H]!") playsound(src.loc, 'splat.ogg', 50, 1) - /* - if(ismob(load)) - var/mob/M = load - if(M.reagents.has_reagent("beer")) - M.unlock_medal("DUI", 1) - if(M.reagents.has_reagent("space_drugs") && istype(H) && H.wear_id.assignment == "Security Officer") - M.unlock_medel("Ridin' Dirty",1) - */ - var/damage = rand(5,15) H.apply_damage(2*damage, BRUTE, "head") H.apply_damage(2*damage, BRUTE, "chest") diff --git a/code/game/magic/cultist/ritual.dm b/code/game/magic/cultist/ritual.dm index 079c747c804..bfd829d5e60 100644 --- a/code/game/magic/cultist/ritual.dm +++ b/code/game/magic/cultist/ritual.dm @@ -496,7 +496,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", if(prob(C*5-105-(runedec-ticker.mode.cult.len)*5)) //including the useless rune at the secret room, shouldn't count against the limit - Urist usr.emote("scream") user << "\red A tear momentarily appears in reality. Before it closes, you catch a glimpse of that which lies beyond. That proves to be too much for your mind." - usr.gib(1) + usr.gib() return if("No") return diff --git a/code/game/magic/cultist/runes.dm b/code/game/magic/cultist/runes.dm index 632abd86abb..2a53af6861e 100644 --- a/code/game/magic/cultist/runes.dm +++ b/code/game/magic/cultist/runes.dm @@ -294,7 +294,7 @@ var/list/sacrificed = list() body_to_sacrifice.visible_message("\red [body_to_sacrifice] is torn apart, a black smoke swiftly dissipating from his remains!", \ "\red You feel as your blood boils, tearing you apart.", \ "\red You hear a thousand voices, all crying in pain.") - body_to_sacrifice.gib(1) + body_to_sacrifice.gib() if (ticker.mode.name == "cult") ticker.mode:add_cultist(body_to_sacrifice.mind) else @@ -560,7 +560,7 @@ var/list/sacrificed = list() if(H.mind == ticker.mode:sacrifice_target) if(cultsinrange.len >= 3) sacrificed += H.mind - H.gib(1) + H.gib() usr << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete." else usr << "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual." @@ -573,7 +573,7 @@ var/list/sacrificed = list() else usr << "\red The Geometer of blood accepts this sacrifice." usr << "\red However, this soul was not enough to gain His favor." - H.gib(1) + H.gib() else if(prob(40)) usr << "\red The Geometer of blood accepts this sacrifice." @@ -581,7 +581,7 @@ var/list/sacrificed = list() else usr << "\red The Geometer of blood accepts this sacrifice." usr << "\red However, a mere dead body is not enough to satisfy Him." - H.gib(1) + H.gib() else if(H.stat !=2) usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed." @@ -592,7 +592,7 @@ var/list/sacrificed = list() else usr << "\red The Geometer of blood accepts this sacrifice." usr << "\red However, a mere dead body is not enough to satisfy Him." - H.gib(1) + H.gib() else if(cultsinrange.len >= 3) if(H.stat !=2) @@ -602,7 +602,7 @@ var/list/sacrificed = list() else usr << "\red The Geometer of blood accepts this sacrifice." usr << "\red However, this soul was not enough to gain His favor." - H.gib(1) + H.gib() else if(prob(40)) usr << "\red The Geometer of blood accepts this sacrifice." @@ -610,7 +610,7 @@ var/list/sacrificed = list() else usr << "\red The Geometer of blood accepts this sacrifice." usr << "\red However, a mere dead body is not enough to satisfy Him." - H.gib(1) + H.gib() else if(H.stat !=2) usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed." @@ -621,7 +621,7 @@ var/list/sacrificed = list() else usr << "\red The Geometer of blood accepts this sacrifice." usr << "\red However, a mere dead body is not enough to satisfy Him." - H.gib(1) + H.gib() for(var/mob/living/carbon/monkey/M in src.loc) if (ticker.mode.name == "cult") if(M.mind == ticker.mode:sacrifice_target) @@ -642,11 +642,11 @@ var/list/sacrificed = list() usr << "\red The Geometer of Blood accepts your meager sacrifice." if(prob(20)) ticker.mode.grant_runeword(usr) - M.gib(1) + M.gib() /* for(var/mob/living/carbon/alien/A) for(var/mob/K in cultsinrange) K.say("Barhah hra zar'garis!") - A.dust() /// A.gib(1) doesnt work for some reason, and dust() leaves that skull and bones thingy which we dont really need. + A.dust() /// A.gib() doesnt work for some reason, and dust() leaves that skull and bones thingy which we dont really need. if (ticker.mode.name == "cult") if(prob(75)) usr << "\red The Geometer of Blood accepts your exotic sacrifice." @@ -902,7 +902,7 @@ var/list/sacrificed = list() M << "\red Your blood boils!" if(prob(5)) spawn(5) - M.gib(1) + M.gib() for(var/obj/effect/rune/R in view(src)) if(prob(10)) explosion(R.loc, -1, 0, 1, 5) diff --git a/code/game/topic.dm b/code/game/topic.dm index db45c7d9922..a8a22ff1229 100644 --- a/code/game/topic.dm +++ b/code/game/topic.dm @@ -30,7 +30,7 @@ for(var/mob/M in world) if(M.client) - if(M.client.holder && M.client.authenticated) + if(M.client.holder) if(!M.client.stealth) admins++ diff --git a/code/game/verbs/authorize.dm b/code/game/verbs/authorize.dm index 21638713c82..2129eb67d45 100644 --- a/code/game/verbs/authorize.dm +++ b/code/game/verbs/authorize.dm @@ -1,3 +1,4 @@ +/* /client/proc/authorize() set name = "Authorize" @@ -41,6 +42,7 @@ src << "Try again using the Authorize command, sometimes the server will hiccup and not correctly authorize." src << "\blue[no_auth_motd]" src.authenticating = 0 +*/ /* The old goon auth/beta code is here /client/proc/beta_tester_auth() diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 661bbfcd70b..c1a210f5f8f 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -12,7 +12,7 @@ /mob/verb/ooc(msg as text) set name = "OOC" //Gave this shit a shorter name so you only have to time out "ooc" rather than "ooc message" to use it --NeoFite set category = "OOC" - if (!src.client.authenticated || IsGuestKey(src.key)) + if (IsGuestKey(src.key)) src << "You are not authorized to communicate over these channels." return msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN) @@ -38,17 +38,15 @@ for (var/client/C) if (src.client.holder && (!src.client.stealth || C.holder)) -// C << "OOC: [src.key]: [msg]" if (src.client.holder.rank == "Admin Observer") - C << "OOC: [src.key][src.client.stealth ? "/([src.client.fakekey])" : ""]: [msg]" + C << "OOC: [src.key][src.client.stealth ? "/([src.client.fakekey])" : ""]: [msg]" else if (src.client.holder.level >= 5) - C << "OOC: [src.key][src.client.stealth ? "/([src.client.fakekey])" : ""]: [msg]" + C << "OOC: [src.key][src.client.stealth ? "/([src.client.fakekey])" : ""]: [msg]" else - C << "OOC: [src.key][src.client.stealth ? "/([src.client.fakekey])" : ""]: [msg]" + C << "OOC: [src.key][src.client.stealth ? "/([src.client.fakekey])" : ""]: [msg]" else if (C.listen_ooc) - C << "OOC: [src.client.stealth ? src.client.fakekey : src.key]: [msg]" - + C << "OOC: [src.client.stealth ? src.client.fakekey : src.key]: [msg]" /* /mob/verb/goonsay(msg as text) set name = "Goonsay" diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm index aedf61dbec1..f0697bbf9ec 100644 --- a/code/game/verbs/who.dm +++ b/code/game/verbs/who.dm @@ -6,24 +6,14 @@ var/list/peeps = list() - if (config.enable_authentication) - for (var/mob/M in world) - if (!M.client) - continue + for (var/mob/M in world) + if (!M.client) + continue - if (M.client.authenticated && M.client.authenticated != 1) - peeps += "\t[M.client] ([html_encode(M.client.authenticated)])" - else - peeps += "\t[M.client]" - else - for (var/mob/M in world) - if (!M.client) - continue - - if (M.client.stealth && !usr.client.holder) - peeps += "\t[M.client.fakekey]" - else - peeps += "\t[M.client][M.client.stealth ? " (as [M.client.fakekey])" : ""]" + if (M.client.stealth && !usr.client.holder) + peeps += "\t[M.client.fakekey]" + else + peeps += "\t[M.client][M.client.stealth ? " (as [M.client.fakekey])" : ""]" peeps = sortList(peeps) @@ -39,7 +29,7 @@ usr << "Current Admins:" for (var/mob/M in world) - if(M && M.client && M.client.holder && M.client.authenticated) + if(M && M.client && M.client.holder) if(usr.client.holder) usr << "[M.key] is a [M.client.holder.rank][M.client.stealth ? " (as [M.client.fakekey])" : ""]" else if(!M.client.stealth) diff --git a/code/game/vote.dm b/code/game/vote.dm index 16eee1c5636..0bcc5b3713e 100644 --- a/code/game/vote.dm +++ b/code/game/vote.dm @@ -169,9 +169,6 @@ /mob/verb/vote() set category = "OOC" set name = "Vote" - if(!usr.client.authenticated) - usr << "You're not authenticated, you can't vote." - return usr.client.showvote = 1 @@ -324,7 +321,7 @@ for(var/mob/CM in world) if(CM.client) - if(config.vote_no_default || (config.vote_no_dead && CM.stat == 2) || !CM.client.authenticated) + if( config.vote_no_default || (config.vote_no_dead && CM.stat == 2) ) CM.client.vote = "none" else CM.client.vote = "default" diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index d916303457d..6c314fff632 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -7,7 +7,7 @@ var/global/BSACooldown = 0 var/rendered = "ADMIN LOG: [text]" log_adminwarn(rendered) for (var/mob/M in world) - if (M && M.client && M.client.holder && M.client.authenticated) + if (M && M.client && M.client.holder) if (admin_ref) M << dd_replaceText(rendered, "%admin_ref%", "\ref[M]") else @@ -959,15 +959,15 @@ var/global/BSACooldown = 0 log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Observer.)") message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Observer.)", 1) - if (href_list["adminauth"]) - if ((src.rank in list( "Admin Candidate", "Temporary Admin", "Trial Admin", "Badmin", "Game Admin", "Game Master" ))) - var/mob/M = locate(href_list["adminauth"]) - if (ismob(M) && !M.client.authenticated && !M.client.authenticating) - M.client.verbs -= /client/proc/authorize - M.client.authenticated = text("admin/[]", usr.client.authenticated) - log_admin("[key_name(usr)] authorized [key_name(M)]") - message_admins("\blue [key_name_admin(usr)] authorized [key_name_admin(M)]", 1) - M.client << text("You have been authorized by []", usr.key) +// if (href_list["adminauth"]) +// if ((src.rank in list( "Admin Candidate", "Temporary Admin", "Trial Admin", "Badmin", "Game Admin", "Game Master" ))) +// var/mob/M = locate(href_list["adminauth"]) +// if (ismob(M) && !M.client.authenticated && !M.client.authenticating) +// M.client.verbs -= /client/proc/authorize +// M.client.authenticated = text("admin/[]", usr.client.authenticated) +// log_admin("[key_name(usr)] authorized [key_name(M)]") +// message_admins("\blue [key_name_admin(usr)] authorized [key_name_admin(M)]", 1) +// M.client << text("You have been authorized by []", usr.key) if (href_list["revive"]) if ((src.rank in list( "Trial Admin", "Badmin", "Game Admin", "Game Master" ))) @@ -1803,32 +1803,16 @@ var/global/BSACooldown = 0 world << sound('granomalies.ogg') var/turf/T = pick(blobstart) var/obj/effect/bhole/bh = new /obj/effect/bhole( T.loc, 30 ) - spawn(rand(50, 300)) + spawn(rand(100, 600)) del(bh) - if("timeanomalies") + + if("timeanomalies") //dear god this code was awful :P Still needs further optimisation feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","STA") - command_alert("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert") - world << sound('spanomalies.ogg') - var/list/turfs = list( ) - var/turf/picked - for(var/turf/T in world) - if(T.z == 1 && istype(T,/turf/simulated/floor) && !istype(T,/turf/space)) - turfs += T - for(var/turf/T in world) - set background = 1 - if(prob(20) && T.z == 1 && istype(T,/turf/simulated/floor)) - spawn(50+rand(0,3000)) - picked = pick(turfs) - var/obj/effect/portal/P = new /obj/effect/portal( T ) - P.target = picked - P.creator = null - P.icon = 'objects.dmi' - P.failchance = 0 - P.icon_state = "anom" - P.name = "wormhole" - spawn(rand(300,600)) - del(P) + //moved to its own dm so I could split it up and prevent the spawns copying variables over and over + //can be found in code\game\game_modes\events\wormholes.dm + wormhole_event() + if("goblob") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","BL") @@ -2218,10 +2202,10 @@ var/global/BSACooldown = 0 var/dat = "Options for [M.key]" var/foo = "\[ " if (ismob(M) && M.client) - if(!M.client.authenticated && !M.client.authenticating) - foo += text("Authorize | ") - else - foo += text("Authorized | ") +// if(!M.client.authenticated && !M.client.authenticating) +// foo += text("Authorize | ") +// else +// foo += text("Authorized | ") foo += text("Promote/Demote | ") if(!istype(M, /mob/new_player)) if(!ismonkey(M)) @@ -2518,14 +2502,14 @@ var/global/BSACooldown = 0 for(var/mob/CM in world) if(CM.client) - if(config.vote_no_default || (config.vote_no_dead && CM.stat == 2) || !CM.client.authenticated) + if(config.vote_no_default || (config.vote_no_dead && CM.stat == 2)) CM.client.vote = "none" else CM.client.vote = "default" for(var/mob/CM in world) if(CM.client) - if(config.vote_no_default || (config.vote_no_dead && CM.stat == 2) || !CM.client.authenticated) + if(config.vote_no_default || (config.vote_no_dead && CM.stat == 2)) CM.client.vote = "none" else CM.client.vote = "default" diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index f73084ccd45..f9bcb6ff3a5 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -523,7 +523,7 @@ /client/proc/stealth() set category = "Admin" set name = "Stealth Mode" - if(!authenticated || !holder) + if(!holder) src << "Only administrators may use this command." return stealth = !stealth @@ -546,7 +546,7 @@ set category = "Special Verbs" set name = "Warn" set desc = "Warn a player" - if(!authenticated || !holder) + if(!holder) src << "Only administrators may use this command." return if(M.client && M.client.holder && (M.client.holder.level >= holder.level)) @@ -662,7 +662,7 @@ /client/proc/toggle_clickproc() //TODO ERRORAGE (This is a temporary verb here while I test the new clicking proc) set name = "Toggle NewClickProc" - set category = "Admin" + set category = "Debug" if(!holder) return using_new_click_proc = !using_new_click_proc diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 7162aca1e53..4216c68fffd 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -1,9 +1,6 @@ /mob/verb/adminhelp(msg as text) set category = "Admin" set name = "Adminhelp" - if(!usr.client.authenticated) - src << "Please authorize before sending these messages." - return msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN) diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index 3a63519082f..3b38935c933 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -2,7 +2,7 @@ set name = "Jump to Area" set desc = "Area to jump to" set category = "Admin" - if(!src.authenticated || !src.holder) + if(!src.holder) src << "Only administrators may use this command." return @@ -17,7 +17,7 @@ /client/proc/jumptoturf(var/turf/T in world) set name = "Jump to Turf" set category = "Admin" - if(!src.authenticated || !src.holder) + if(!src.holder) src << "Only administrators may use this command." return if(config.allow_admin_jump) @@ -32,7 +32,7 @@ set category = "Admin" set name = "Jump to Mob" - if(!src.authenticated || !src.holder) + if(!src.holder) src << "Only administrators may use this command." return @@ -53,7 +53,7 @@ set category = "Admin" set name = "Jump to Coordinate" - if (!authenticated || !holder) + if (!holder) src << "Only administrators may use this command." return @@ -72,7 +72,7 @@ set category = "Admin" set name = "Jump to Key" - if(!src.authenticated || !src.holder) + if(!src.holder) src << "Only administrators may use this command." return @@ -94,7 +94,7 @@ set category = "Admin" set name = "Get Mob" set desc = "Mob to teleport" - if(!src.authenticated || !src.holder) + if(!src.holder) src << "Only administrators may use this command." return if(config.allow_admin_jump) @@ -109,7 +109,7 @@ set name = "Get Key" set desc = "Key to teleport" - if(!src.authenticated || !src.holder) + if(!src.holder) src << "Only administrators may use this command." return @@ -134,7 +134,7 @@ /client/proc/sendmob(var/mob/M in world, var/area/A in world) set category = "Admin" set name = "Send Mob" - if(!src.authenticated || !src.holder) + if(!src.holder) src << "Only administrators may use this command." return if(config.allow_admin_jump) diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index ed389c44ebe..58cdc970695 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -3,9 +3,7 @@ set name = "Asay" //Gave this shit a shorter name so you only have to time out "asay" rather than "admin say" to use it --NeoFite set hidden = 1 - // All admins should be authenticated, but... what if? - - if (!src.authenticated || !src.holder) + if (!src.holder) src << "Only administrators may use this command." return @@ -23,7 +21,7 @@ for (var/mob/M in world) if (M.client && M.client.holder) if (src.holder.rank == "Admin Observer") - M << "ADMIN: [key_name(usr, M)]: [msg]" + M << "ADMIN: [key_name(usr, M)]: [msg]" else - M << "ADMIN: [key_name(usr, M)] (JMP): [msg]" + M << "ADMIN: [key_name(usr, M)] (JMP): [msg]" diff --git a/code/modules/admin/verbs/atmosdebug.dm b/code/modules/admin/verbs/atmosdebug.dm index 352672e4d69..84910af33cb 100644 --- a/code/modules/admin/verbs/atmosdebug.dm +++ b/code/modules/admin/verbs/atmosdebug.dm @@ -1,7 +1,7 @@ /client/proc/atmosscan() set category = "Mapping" set name = "Check Plumbing" - if(!src.authenticated || !src.holder) + if(!src.holder) src << "Only administrators may use this command." return diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index 0b2afb5dd74..a9f2f1d4d1b 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -3,7 +3,7 @@ set name = "Dsay" //Gave this shit a shorter name so you only have to time out "dsay" rather than "dead say" to use it --NeoFite set hidden = 1 // All admins should be authenticated, but... what if? - if(!src.authenticated || !src.holder) + if(!src.holder) src << "Only administrators may use this command." return if(!src.mob) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 3615dd0a695..b83aba8be2d 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -1,7 +1,7 @@ /client/proc/Debug2() set category = "Debug" set name = "Debug-Game" - if(!authenticated || !holder) + if(!holder) src << "Only administrators may use this command." return if(holder.rank == "Game Admin") @@ -32,7 +32,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that /client/proc/callproc() set category = "Debug" set name = "Advanced ProcCall" - if(!authenticated || !holder) + if(!holder) src << "Only administrators may use this command." return var/target = null diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index b317bd99668..2adb0e9f0ba 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -180,7 +180,7 @@ jump_to_dead_group() set name = "Jump to dead group" set category = "Debug" - if(!authenticated || !holder) + if(!holder) src << "Only administrators may use this command." return @@ -199,7 +199,7 @@ set name = "Kill Local Airgroup" set desc = "Use this to allow manual manupliation of atmospherics." set category = "Debug" - if(!authenticated || !holder) + if(!holder) src << "Only administrators may use this command." return diff --git a/code/modules/admin/verbs/massmodvar.dm b/code/modules/admin/verbs/massmodvar.dm index 72eb84dcda6..3453283e257 100644 --- a/code/modules/admin/verbs/massmodvar.dm +++ b/code/modules/admin/verbs/massmodvar.dm @@ -23,7 +23,7 @@ /client/proc/massmodify_variables(var/atom/O, var/var_name = "", var/method = 0) var/list/locked = list("vars", "key", "ckey", "client") - if(!src.authenticated || !src.holder) + if(!src.holder) src << "Only administrators may use this command." return diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index a14154bcccd..1bf374c6a7d 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -269,7 +269,7 @@ var/list/forbidden_varedit_object_types = list( /client/proc/modify_variables(var/atom/O, var/param_var_name = null, var/autodetect_class = 0) var/list/locked = list("vars", "key", "ckey", "client", "firemut", "ishulk", "telekinesis", "xray", "virus", "cuffed", "ka", "last_eaten", "urine", "poo", "icon", "icon_state") - if(!src.authenticated || !src.holder) + if(!src.holder) src << "Only administrators may use this command." return diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index db64d6811f9..a2aeb5d72f7 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -3,7 +3,7 @@ set name = "Play Global Sound" //if(Debug2) - if(!src.authenticated || !src.holder) + if(!src.holder) src << "Only administrators may use this command." return @@ -37,7 +37,7 @@ set category = "Fun" set name = "Play Local Sound" - if(!src.authenticated || !src.holder) + if(!src.holder) src << "Only administrators may use this command." return @@ -62,7 +62,7 @@ for(var/mob/living/carbon/human/CP in world) if(CP.real_name=="Cuban Pete" && CP.key!="Rosham") CP << "Your body can't contain the rhumba beat" - CP.gib(1) + CP.gib() /client/proc/bananaphone() diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 8f9de74638f..69ffc12b836 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -1,9 +1,6 @@ /mob/verb/pray(msg as text) set category = "IC" set name = "Pray" - if(!usr.client.authenticated) - src << "Please authorize before sending these messages." - return msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index ba985b2d1c1..85a8055ea2a 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -1,7 +1,7 @@ /client/proc/cmd_admin_drop_everything(mob/M as mob in world) set category = null set name = "Drop Everything" - if(!authenticated || !holder) + if(!holder) src << "Only administrators may use this command." return for(var/obj/item/W in M) @@ -13,7 +13,7 @@ /client/proc/cmd_admin_prison(mob/M as mob in world) set category = "Admin" set name = "Prison" - if(!authenticated || !holder) + if(!holder) src << "Only administrators may use this command." return if (ismob(M)) @@ -41,7 +41,7 @@ set name = "Subtle Message" if(!ismob(M)) return - if (!authenticated || !holder) + if (!holder) src << "Only administrators may use this command." return @@ -61,7 +61,7 @@ set category = "Special Verbs" set name = "Global Narrate" - if (!authenticated || !holder) + if (!holder) src << "Only administrators may use this command." return @@ -77,7 +77,7 @@ set category = "Special Verbs" set name = "Direct Narrate" - if(!authenticated || !holder) + if(!holder) src << "Only administrators may use this command." return var/msg = input("Message:", text("Enter the text you wish to appear to your target:")) as text @@ -89,7 +89,7 @@ /client/proc/cmd_admin_pm_context(mob/M as mob in world) set category = null set name = "Admin PM Mob" - if(!authenticated || !holder) + if(!holder) src << "\red Error: Admin-PM-Context: Only administrators may use this command." return if( !ismob(M) || !M.client ) return @@ -99,7 +99,7 @@ /client/proc/cmd_admin_pm_panel() set category = "Admin" set name = "Admin PM" - if(!authenticated || !holder) + if(!holder) src << "\red Error: Admin-PM-Panel: Only administrators may use this command." return var/list/client/targets[0] @@ -118,7 +118,7 @@ cmd_admin_pm(targets[target]) //takes input from cmd_admin_pm_context, cmd_admin_pm_panel or /client/Topic and sends them a PM after fetching a message to send. -/client/proc/cmd_admin_pm(var/client/C = null) +/client/proc/cmd_admin_pm(var/client/C = null, var/t = null) if( !C || !istype(C,/client) ) src << "\red Error: Admin-PM: Client not found." return @@ -127,15 +127,17 @@ return //get message text, limit it's length.and clean/escape html - var/t = input("Message:", "Private message to [C.key]") as text|null - if(!t) return - if(!C) - src << "\red Error: Admin PM: Client not found." + if(!t) + t = input("Message:", "Private message to [C.key]") as text|null + if(!t) return + if(!C) + src << "\red Error: Admin PM: Client not found." + return - - if( !holder || !(holder.rank in list("Game Admin", "Game Master")) ) //clean the message if it's not sent by a GA or GM + //clean the message if it's not sent by a GA or GM + if( !holder || !(holder.rank in list("Game Admin", "Game Master")) ) t = sanitize(copytext(t,1,500)) - if(!t) return + if(!t) return if(C.holder) @@ -161,6 +163,22 @@ //always play non-admin recipients the adminhelp sound C << 'adminhelp.ogg' + //AdminPM popup for ApocStation and anybody else who wants to use it. Set it with POPUP_ADMIN_PM in config.txt ~Carn + if(config.popup_admin_pm) + spawn() //so we don't hold the caller proc up + var/sender = src + var/sendername = key + var/reply = input(C, t,"Admin PM from-[sendername]", "") as text|null //show message and await a reply + if(C && reply) + if(sender) + C.cmd_admin_pm(sender,reply) //sender is still about, let's reply to them + else + for(var/client/X) //sender has left! find another admin to pm + if(X.holder) + return C.cmd_admin_pm(X,reply) + C << "Error: Admin PM: Client not found." //couldn't find one + return + else //neither are admins src << "Error: Admin PM: Non-admin to non-admin PM communication is forbidden." return @@ -175,7 +193,7 @@ /client/proc/cmd_admin_godmode(mob/M as mob in world) set category = "Special Verbs" set name = "Godmode" - if(!authenticated || !holder) + if(!holder) src << "Only administrators may use this command." return if (M.nodamage == 1) @@ -191,7 +209,7 @@ /client/proc/cmd_admin_mute(mob/M as mob in world) set category = "Special Verbs" set name = "Admin Mute" - if(!authenticated || !holder) + if(!holder) src << "Only administrators may use this command." return if (M.client && M.client.holder && (M.client.holder.level >= holder.level)) @@ -211,7 +229,7 @@ /client/proc/cmd_admin_add_random_ai_law() set category = "Fun" set name = "Add Random AI Law" - if(!authenticated || !holder) + if(!holder) src << "Only administrators may use this command." return log_admin("[key_name(src)] has added a random AI law.") @@ -234,7 +252,7 @@ set desc = "Spawns a xenomorph for all those boring rounds, without having you to do so manually." set popup_menu = 0 - if(!authenticated || !holder) + if(!holder) src << "Only administrators may use this command." return @@ -294,7 +312,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Special Verbs" set name = "Respawn Character" set desc = "Respawn a person that has been gibbed/dusted/killed. They must be a ghost for this to work and preferably should not have a body to go back into." - if(!authenticated || !holder) + if(!holder) src << "Only administrators may use this command." return var/input = input(src, "Please specify which key will be respawned.", "Key", "") @@ -513,7 +531,7 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/cmd_admin_add_freeform_ai_law() set category = "Fun" set name = "Add Custom AI law" - if(!authenticated || !holder) + if(!holder) src << "Only administrators may use this command." return var/input = input(usr, "Please enter anything you want the AI to do. Anything. Serious.", "What?", "") as text|null @@ -540,8 +558,7 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/cmd_admin_rejuvenate(mob/living/M as mob in world) set category = "Special Verbs" set name = "Rejuvenate" - // All admins should be authenticated, but... what if? - if(!authenticated || !holder) + if(!holder) src << "Only administrators may use this command." return if(!mob) @@ -577,7 +594,7 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/cmd_admin_create_centcom_report() set category = "Special Verbs" set name = "Create Command Report" - if(!authenticated || !holder) + if(!holder) src << "Only administrators may use this command." return var/input = input(usr, "Please enter anything you want. Anything. Serious.", "What?", "") as message|null @@ -601,7 +618,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Admin" set name = "Delete" - if (!authenticated || !holder) + if (!holder) src << "Only administrators may use this command." return @@ -614,7 +631,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Admin" set name = "List free slots" - if (!authenticated || !holder) + if (!holder) src << "Only administrators may use this command." return if(job_master) @@ -625,7 +642,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Special Verbs" set name = "Explosion" - if (!authenticated || !holder) + if (!holder) src << "Only administrators may use this command." return @@ -655,7 +672,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Special Verbs" set name = "EM Pulse" - if (!authenticated || !holder) + if (!holder) src << "Only administrators may use this command." return @@ -678,7 +695,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Special Verbs" set name = "Gib" - if (!authenticated || !holder) + if (!holder) src << "Only administrators may use this command." return @@ -736,7 +753,6 @@ Traitors and the like can also be revived with the previous role mostly intact. return if(M) AddBan(M.ckey, M.computer_id, reason, usr.ckey, 1, mins) - M.unlock_medal("Banned", 1) M << "\redYou have been banned by [usr.client.ckey].\nReason: [reason]." M << "\red This is a temporary ban, it will be removed in [mins] minutes." M << "\red To try to resolve this matter head to http://ss13.donglabs.com/forum/" @@ -752,7 +768,6 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!reason) return AddBan(M.ckey, M.computer_id, reason, usr.ckey, 0, 0) - M.unlock_medal("Banned", 1) M << "\redYou have been banned by [usr.client.ckey].\nReason: [reason]." M << "\red This is a permanent ban." M << "\red To try to resolve this matter head to http://ss13.donglabs.com/forum/" @@ -779,7 +794,7 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/cmd_admin_remove_plasma() set category = "Debug" set name = "Stabilize Atmos." - if(!authenticated || !holder) + if(!holder) src << "Only administrators may use this command." return // DEFERRED @@ -824,7 +839,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if ((!( ticker ) || emergency_shuttle.location)) return - if (!authenticated || !holder) + if (!holder) src << "Only administrators may use this command." return @@ -851,7 +866,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if ((!( ticker ) || emergency_shuttle.location || emergency_shuttle.direction == 0)) return - if (!authenticated || !holder) + if (!holder) src << "Only administrators may use this command." return diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm index 51b62ba17fa..41d73db4dd4 100644 --- a/code/modules/admin/verbs/striketeam.dm +++ b/code/modules/admin/verbs/striketeam.dm @@ -6,7 +6,7 @@ var/global/sent_strike_team = 0 set category = "Fun" set name = "Spawn Death Squad" set desc = "Spawns a squad of commandos in CentCom if you want to run an admin event." - if(!src.authenticated || !src.holder) + if(!src.holder) src << "Only administrators may use this command." return if(!ticker) diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm index 8c601b3024b..8c7d3758ff8 100644 --- a/code/modules/admin/verbs/striketeam_syndicate.dm +++ b/code/modules/admin/verbs/striketeam_syndicate.dm @@ -6,7 +6,7 @@ var/global/sent_syndicate_strike_team = 0 set category = "Fun" set name = "Spawn Syndicate Strike Team" set desc = "Spawns a squad of commandos in the Syndicate Mothership if you want to run an admin event." - if(!src.authenticated || !src.holder) + if(!src.holder) src << "Only administrators may use this command." return if(!ticker) diff --git a/code/modules/admin/verbs/ticklag.dm b/code/modules/admin/verbs/ticklag.dm index 5bd914c275f..dd3b1764d27 100644 --- a/code/modules/admin/verbs/ticklag.dm +++ b/code/modules/admin/verbs/ticklag.dm @@ -5,7 +5,7 @@ set name = "Set Ticklag" set desc = "Sets a new tick lag. Recommend you don't mess with this too much! Stable, time-tested ticklag value is 0.9" if(Debug2) - if(src.authenticated && src.holder) + if(src.holder) if(!src.mob) return if(src.holder.rank in list("Game Admin", "Game Master")) diff --git a/code/modules/mob/living/blob/blob.dm b/code/modules/mob/living/blob/blob.dm index c7948526af4..7c4cd8eeeca 100644 --- a/code/modules/mob/living/blob/blob.dm +++ b/code/modules/mob/living/blob/blob.dm @@ -202,7 +202,7 @@ set desc = "Ghost into blobthing." set hidden = 1 - if(!authenticated || !holder) + if(!holder) src << "Only administrators may use this command." return var/input = input(src, "Please specify which key will be turned into a bloby.", "Key", "") diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 62035c47bdc..af4462c5ddc 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -90,7 +90,7 @@ flick("flash", flash) if (stat == 2 && client) - gib(1) + gib() return else if (stat == 2 && !client) @@ -105,7 +105,7 @@ switch (severity) if (1.0) b_loss += 500 - gib(1) + gib() return if (2.0) diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index eb27d1ffe6f..8ed376f989d 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -78,7 +78,7 @@ flick("flash", flash) if (stat == 2 && client) - gib(1) + gib() return else if (stat == 2 && !client) @@ -91,7 +91,7 @@ switch (severity) if (1.0) b_loss += 500 - gib(1) + gib() return if (2.0) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 657ca1c1b57..62d8c392397 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -35,7 +35,7 @@ if(prob(src.getBruteLoss() - 50)) src.gib() -/mob/living/carbon/gib(give_medal) +/mob/living/carbon/gib() for(var/mob/M in src) if(M in src.stomach_contents) src.stomach_contents.Remove(M) @@ -43,7 +43,7 @@ for(var/mob/N in viewers(src, null)) if(N.client) N.show_message(text("\red [M] bursts out of [src]!"), 2) - . = ..(give_medal) + . = ..() /mob/living/carbon/attack_hand(mob/M as mob) if(!istype(M, /mob/living/carbon)) return diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index f860fff48b5..a4607f52996 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -247,7 +247,7 @@ // /obj/item/clothing/head/bomb_hood(src) if (stat == 2 && client) - gib(1) + gib() return else if (stat == 2 && !client) @@ -262,7 +262,7 @@ if (1.0) b_loss += 500 if (!prob(getarmor(null, "bomb"))) - gib(1) + gib() return else var/atom/target = get_edge_target_turf(src, get_dir(src, get_step_away(src, src))) diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 0f2e0279605..1df5e07c45f 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -540,7 +540,7 @@ /mob/living/carbon/monkey/ex_act(severity) flick("flash", flash) if (stat == 2 && client) - gib(1) + gib() return if (stat == 2 && !client) @@ -573,7 +573,7 @@ if (prob(50)) Paralyse(10) if (stat == DEAD && client) - gib(1) + gib() return if (stat == DEAD && !client) gibs(loc, viruses) diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 2ee69c5746e..ed41014c0de 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -304,7 +304,7 @@ src << "\red Killswitch Activated" killswitch = 0 spawn(5) - gib(src) + gib() process_locks() if(weapon_lock) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index d45fb2fa220..0dbf82863c9 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -236,7 +236,7 @@ flick("flash", flash) if (stat == 2 && client) - gib(1) + gib() return else if (stat == 2 && !client) @@ -248,7 +248,7 @@ if (stat != 2) adjustBruteLoss(100) adjustFireLoss(100) - gib(1) + gib() return if(2.0) if (stat != 2) @@ -291,7 +291,6 @@ if(prob(20)) usr << "\red You fail to push [tmob]'s fat ass out of the way." now_pushing = 0 - //unlock_medal("That's No Moon, That's A Gourmand!", 1) return if(tmob.nopush) now_pushing = 0 @@ -1056,7 +1055,7 @@ Frequency: return /mob/living/silicon/robot/proc/self_destruct() - gib(1) + gib() return /mob/living/silicon/robot/proc/UnlinkSelf() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index fa8f15b2667..ff4b45ea90d 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -710,14 +710,14 @@ if (join_motd) src << "
[join_motd]
" - authorize() +// authorize() //old gooncode if(admins.Find(ckey)) holder = new /obj/admins(src) holder.rank = admins[ckey] update_admins(admins[ckey]) - if(ticker && ticker.mode && ticker.mode.name =="sandbox" && authenticated) + if(ticker && ticker.mode && ticker.mode.name =="sandbox") mob.CanBuild() /client/Del() @@ -746,7 +746,7 @@ for(var/mob/M in viewers()) M.see(message) -//This is the proc for gibbing a mob. Cannot gib ghosts. Removed the medal reference, +//This is the proc for gibbing a mob. Cannot gib ghosts. //added different sort of gibs and animations. N /mob/proc/gib() diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 548dae189ec..4913040fb72 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -178,10 +178,6 @@ return 1 if(href_list["ready"]) - if (!client.authenticated) - src << "You are not authorized to enter the game." - return - if(!ready) ready = 1 else @@ -192,9 +188,6 @@ new_player_panel_proc() if(href_list["observe"]) - if (!client.authenticated) - src << "You are not authorized to enter the game." - return if(alert(src,"Are you sure you wish to observe? You will not be able to play this round!","Player Setup","Yes","No") == "Yes") var/mob/dead/observer/observer = new() @@ -222,9 +215,6 @@ LateChoices() if(href_list["SelectedJob"]) - if(!client.authenticated) - src << "You are not authorized to enter the game." - return if(!enter_allowed) usr << "\blue There is an administrative lock on entering the game!" diff --git a/code/modules/power/antimatter/fuel.dm b/code/modules/power/antimatter/fuel.dm index 2d6b279812b..71b22d32647 100644 --- a/code/modules/power/antimatter/fuel.dm +++ b/code/modules/power/antimatter/fuel.dm @@ -75,7 +75,7 @@ /obj/item/weapon/fuel/proc/injest(mob/M as mob) switch(content) if("Anti-Hydrogen") - M.gib(1) + M.gib() if("Hydrogen") M << "\blue You feel very light, as if you might just float away..." del(src) diff --git a/code/stylesheet.dm b/code/stylesheet.dm index 5b0502cc924..89d18267c55 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -1,52 +1,35 @@ client/script = {""} diff --git a/config/config.txt b/config/config.txt index 0ada1e41870..fc060d92aa1 100644 --- a/config/config.txt +++ b/config/config.txt @@ -101,8 +101,6 @@ VOTE_PERIOD 60 ## allow AI job ALLOW_AI -## goon authentication -#AUTHENTICATION ## disable abandon mob NORESPAWN @@ -137,5 +135,9 @@ FEATURE_OBJECT_SPELL_SYSTEM ##Remove the # mark infront of this to forbid admins from posssessing the singularity. #FORBID_SINGULO_POSSESSION +## Remove the # to show a popup 'reply to' window to every non-admin that recieves an adminPM. +## The intention is to make adminPMs more visible. (although I fnd popups annoying so this defaults to off) +#POPUP_ADMIN_PM + ##Remove the # mark if you are going to use the SVN irc bot to relay adminhelps #USEIRCBOT \ No newline at end of file diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index 2f3e86b36d8a82a0d33c35df88021c75483314f4..91db37b21200e8b0f3802be710861482c38a8c0b 100644 GIT binary patch delta 18844 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