Conflicts:
	README.txt
	SQL/tgstation_schema.sql
	baystation12.dme
	code/ATMOSPHERICS/components/unary/vent_pump.dm
	code/ATMOSPHERICS/pipes.dm
	code/FEA/FEA_airgroup.dm
	code/FEA/FEA_fire.dm
	code/FEA/FEA_gas_mixture.dm
	code/FEA/FEA_turf_tile.dm
	code/TriDimension/Pipes.dm
	code/WorkInProgress/buildmode.dm
	code/WorkInProgress/organs/organs.dm
	code/WorkInProgress/virus2/Disease2/analyser.dm
	code/WorkInProgress/virus2/Disease2/biohazard destroyer.dm
	code/WorkInProgress/virus2/Disease2/cureimplanter.dm
	code/WorkInProgress/virus2/Disease2/diseasesplicer.dm
	code/WorkInProgress/virus2/Disease2/dishincubator.dm
	code/WorkInProgress/virus2/Disease2/isolator.dm
	code/WorkInProgress/virus2/Disease2/monkeydispensor.dm
	code/WorkInProgress/virus2/analyser.dm
	code/WorkInProgress/virus2/antibodies.dm
	code/WorkInProgress/virus2/base.dm
	code/WorkInProgress/virus2/biohazard destroyer.dm
	code/WorkInProgress/virus2/cureimplanter.dm
	code/WorkInProgress/virus2/curer.dm
	code/WorkInProgress/virus2/diseasesplicer.dm
	code/WorkInProgress/virus2/dishincubator.dm
	code/WorkInProgress/virus2/isolator.dm
	code/WorkInProgress/virus2/monkeydispensor.dm
	code/datums/ai_laws.dm
	code/datums/configuration.dm
	code/datums/datumvars.dm
	code/datums/diseases/alien_embryo.dm
	code/datums/diseases/appendicitis.dm
	code/datums/diseases/robotic_transformation.dm
	code/datums/diseases/xeno_transformation.dm
	code/datums/helper_datums/getrev.dm
	code/datums/helper_datums/teleport.dm
	code/datums/helper_datums/tension.dm
	code/datums/mind.dm
	code/datums/mixed.dm
	code/datums/shuttle_controller.dm
	code/datums/spell.dm
	code/datums/spells/ethereal_jaunt.dm
	code/datums/spells/genetic.dm
	code/datums/spells/wizard.dm
	code/defines/area/Space Station 13 areas.dm
	code/defines/atom.dm
	code/defines/global.dm
	code/defines/mob/dead/observer.dm
	code/defines/mob/living/carbon/alien.dm
	code/defines/mob/living/carbon/alien_humanoid.dm
	code/defines/mob/living/carbon/carbon.dm
	code/defines/mob/living/carbon/metroid.dm
	code/defines/mob/living/carbon/monkey.dm
	code/defines/mob/living/living.dm
	code/defines/mob/living/silicon/ai.dm
	code/defines/mob/living/silicon/robot.dm
	code/defines/obj.dm
	code/defines/obj/closet.dm
	code/defines/obj/clothing.dm
	code/defines/obj/clothing/costume.dm
	code/defines/obj/computer.dm
	code/defines/obj/costume.dm
	code/defines/obj/decal.dm
	code/defines/obj/door.dm
	code/defines/obj/hydro.dm
	code/defines/obj/machinery.dm
	code/defines/obj/storage.dm
	code/defines/obj/supplypacks.dm
	code/defines/obj/toy.dm
	code/defines/obj/vending.dm
	code/defines/obj/weapon.dm
	code/defines/procs/AStar.dm
	code/defines/procs/command_name.dm
	code/defines/procs/dbcore.dm
	code/defines/procs/forum_activation.dm
	code/defines/procs/gamehelpers.dm
	code/defines/procs/helpers.dm
	code/defines/procs/icon_procs.dm
	code/defines/procs/station_name.dm
	code/defines/procs/statistics.dm
	code/defines/turf.dm
	code/game/algorithm.dm
	code/game/area/areas.dm
	code/game/asteroid/artifacts.dm
	code/game/atom_procs.dm
	code/game/cellautomata.dm
	code/game/dna.dm
	code/game/events/EventProcs/clang.dm
	code/game/events/EventProcs/dust.dm
	code/game/events/EventProcs/ninja_abilities.dm
	code/game/events/EventProcs/ninja_equipment.dm
	code/game/events/EventProcs/space_ninja.dm
	code/game/events/EventProcs/spacevines.dm
	code/game/gamemodes/blob/blob.dm
	code/game/gamemodes/blob/blob_finish.dm
	code/game/gamemodes/blob/blob_report.dm
	code/game/gamemodes/blob/theblob.dm
	code/game/gamemodes/changeling/changeling.dm
	code/game/gamemodes/changeling/changeling_powers.dm
	code/game/gamemodes/changeling/modularchangling.dm
	code/game/gamemodes/changeling/traitor_chan.dm
	code/game/gamemodes/cult/cult.dm
	code/game/gamemodes/cult/cult_items.dm
	code/game/gamemodes/cult/cult_structures.dm
	code/game/gamemodes/events.dm
	code/game/gamemodes/events/black_hole.dm
	code/game/gamemodes/events/miniblob.dm
	code/game/gamemodes/factions.dm
	code/game/gamemodes/game_mode.dm
	code/game/gamemodes/gameticker.dm
	code/game/gamemodes/malfunction/malfunction.dm
	code/game/gamemodes/meteor/meteor.dm
	code/game/gamemodes/meteor/meteors.dm
	code/game/gamemodes/nuclear/nuclear.dm
	code/game/gamemodes/nuclear/nuclearbomb.dm
	code/game/gamemodes/nuclear/pinpointer.dm
	code/game/gamemodes/objective.dm
	code/game/gamemodes/revolution/revolution.dm
	code/game/gamemodes/sandbox/h_sandbox.dm
	code/game/gamemodes/sandbox/sandbox.dm
	code/game/gamemodes/setupgame.dm
	code/game/gamemodes/traitor/traitor.dm
	code/game/gamemodes/wizard/rightandwrong.dm
	code/game/gamemodes/wizard/soulstone.dm
	code/game/gamemodes/wizard/spellbook.dm
	code/game/gamemodes/wizard/spells.dm
	code/game/gamemodes/wizard/veilrender.dm
	code/game/gamemodes/wizard/wizard.dm
	code/game/hud.dm
	code/game/jobs/access.dm
	code/game/jobs/job/captain.dm
	code/game/jobs/job/civilian.dm
	code/game/jobs/job/civilian_chaplain.dm
	code/game/jobs/job/engineering.dm
	code/game/jobs/job/job.dm
	code/game/jobs/job/medical.dm
	code/game/jobs/job/science.dm
	code/game/jobs/job/security.dm
	code/game/jobs/job/silicon.dm
	code/game/jobs/job_controller.dm
	code/game/jobs/jobs.dm
	code/game/machinery/Beacon.dm
	code/game/machinery/OpTable.dm
	code/game/machinery/Sleeper.dm
	code/game/machinery/alarm.dm
	code/game/machinery/atmo_control.dm
	code/game/machinery/atmoalter/area_atmos_computer.dm
	code/game/machinery/autolathe.dm
	code/game/machinery/biogenerator.dm
	code/game/machinery/bots/bots.dm
	code/game/machinery/bots/cleanbot.dm
	code/game/machinery/bots/ed209bot.dm
	code/game/machinery/bots/floorbot.dm
	code/game/machinery/bots/medbot.dm
	code/game/machinery/bots/mulebot.dm
	code/game/machinery/camera.dm
	code/game/machinery/cell_charger.dm
	code/game/machinery/cloning.dm
	code/game/machinery/computer/HolodeckControl.dm
	code/game/machinery/computer/Operating.dm
	code/game/machinery/computer/ai_core.dm
	code/game/machinery/computer/arcade.dm
	code/game/machinery/computer/atmos_alert.dm
	code/game/machinery/computer/buildandrepair.dm
	code/game/machinery/computer/card.dm
	code/game/machinery/computer/cloning.dm
	code/game/machinery/computer/communications.dm
	code/game/machinery/computer/computer.dm
	code/game/machinery/computer/crew.dm
	code/game/machinery/computer/hologram.dm
	code/game/machinery/computer/law.dm
	code/game/machinery/computer/medical.dm
	code/game/machinery/computer/message.dm
	code/game/machinery/computer/pod.dm
	code/game/machinery/computer/power.dm
	code/game/machinery/computer/prisoner.dm
	code/game/machinery/computer/robot.dm
	code/game/machinery/computer/security.dm
	code/game/machinery/computer/shuttle.dm
	code/game/machinery/constructable_frame.dm
	code/game/machinery/deployable.dm
	code/game/machinery/door_control.dm
	code/game/machinery/doors/airlock.dm
	code/game/machinery/doors/airlock_electronics.dm
	code/game/machinery/doors/brigdoors.dm
	code/game/machinery/doors/door.dm
	code/game/machinery/doors/firedoor.dm
	code/game/machinery/doors/poddoor.dm
	code/game/machinery/doors/unpowered.dm
	code/game/machinery/doors/windowdoor.dm
	code/game/machinery/flasher.dm
	code/game/machinery/gateway.dm
	code/game/machinery/hologram.dm
	code/game/machinery/hydroponics.dm
	code/game/machinery/kitchen/gibber.dm
	code/game/machinery/morgue.dm
	code/game/machinery/newscaster.dm
	code/game/machinery/pipe/construction.dm
	code/game/machinery/pipe/pipe_dispenser.dm
	code/game/machinery/portable_turret.dm
	code/game/machinery/recharger.dm
	code/game/machinery/rechargestation.dm
	code/game/machinery/requests_console.dm
	code/game/machinery/shieldgen.dm
	code/game/machinery/spaceheater.dm
	code/game/machinery/suit_storage_unit.dm
	code/game/machinery/syndicatebeacon.dm
	code/game/machinery/telecomms/broadcaster.dm
	code/game/machinery/telecomms/logbrowser.dm
	code/game/machinery/telecomms/machine_interactions.dm
	code/game/machinery/telecomms/telemonitor.dm
	code/game/machinery/telecomms/traffic_control.dm
	code/game/machinery/teleporter.dm
	code/game/machinery/turrets.dm
	code/game/machinery/vending.dm
	code/game/magic/cultist/ritual.dm
	code/game/magic/cultist/runes.dm
	code/game/magic/library.dm
	code/game/magic/musician.dm
	code/game/master_controller.dm
	code/game/mecha/combat/combat.dm
	code/game/mecha/combat/gygax.dm
	code/game/mecha/equipment/mecha_equipment.dm
	code/game/mecha/equipment/tools/tools.dm
	code/game/mecha/equipment/weapons/weapons.dm
	code/game/mecha/mech_fabricator.dm
	code/game/mecha/mecha.dm
	code/game/mecha/mecha_construction_paths.dm
	code/game/mecha/mecha_wreckage.dm
	code/game/mecha/medical/medical.dm
	code/game/mecha/medical/odysseus.dm
	code/game/mecha/working/ripley.dm
	code/game/objects/alien/facehugger.dm
	code/game/objects/alien/resin.dm
	code/game/objects/bodybag.dm
	code/game/objects/closets.dm
	code/game/objects/closets/emergency.dm
	code/game/objects/closets/extinguisher.dm
	code/game/objects/closets/fireaxe.dm
	code/game/objects/closets/firecloset.dm
	code/game/objects/closets/fitnesscloset.dm
	code/game/objects/closets/janitor.dm
	code/game/objects/closets/kitchen.dm
	code/game/objects/closets/nuclear.dm
	code/game/objects/closets/secure/bar.dm
	code/game/objects/closets/secure/cargo.dm
	code/game/objects/closets/secure/engineering.dm
	code/game/objects/closets/secure/hydroponics.dm
	code/game/objects/closets/secure/medical.dm
	code/game/objects/closets/secure/personal.dm
	code/game/objects/closets/secure/scientist.dm
	code/game/objects/closets/secure/secure_closets.dm
	code/game/objects/closets/secure/security.dm
	code/game/objects/closets/syndicate.dm
	code/game/objects/closets/wardrobe.dm
	code/game/objects/contraband.dm
	code/game/objects/crates.dm
	code/game/objects/devices/PDA/PDA.dm
	code/game/objects/devices/PDA/cart.dm
	code/game/objects/devices/PDA/chatroom.dm
	code/game/objects/devices/aicard.dm
	code/game/objects/devices/flash.dm
	code/game/objects/devices/flashlight.dm
	code/game/objects/devices/paicard.dm
	code/game/objects/devices/scanners.dm
	code/game/objects/devices/taperecorder.dm
	code/game/objects/devices/traitordevices.dm
	code/game/objects/door_assembly.dm
	code/game/objects/effect_system.dm
	code/game/objects/electricchair.dm
	code/game/objects/explosion.dm
	code/game/objects/gibs.dm
	code/game/objects/grille.dm
	code/game/objects/items.dm
	code/game/objects/items/blueprints.dm
	code/game/objects/items/candle.dm
	code/game/objects/items/clothing.dm
	code/game/objects/items/food.dm
	code/game/objects/items/helper_procs.dm
	code/game/objects/items/item.dm
	code/game/objects/items/robot_items.dm
	code/game/objects/items/robot_parts.dm
	code/game/objects/items/tk_grab.dm
	code/game/objects/items/weapons/AI_modules.dm
	code/game/objects/items/weapons/RCD.dm
	code/game/objects/items/weapons/RSF.dm
	code/game/objects/items/weapons/cameras.dm
	code/game/objects/items/weapons/cards_ids.dm
	code/game/objects/items/weapons/cigs_lighters.dm
	code/game/objects/items/weapons/clown_items.dm
	code/game/objects/items/weapons/dna_injector.dm
	code/game/objects/items/weapons/explosives.dm
	code/game/objects/items/weapons/flamethrower.dm
	code/game/objects/items/weapons/grenades.dm
	code/game/objects/items/weapons/hand_lablers.dm
	code/game/objects/items/weapons/hydroponics.dm
	code/game/objects/items/weapons/implants/implant.dm
	code/game/objects/items/weapons/implants/implantcase.dm
	code/game/objects/items/weapons/implants/implantchair.dm
	code/game/objects/items/weapons/implants/implanter.dm
	code/game/objects/items/weapons/implants/implantfreedom.dm
	code/game/objects/items/weapons/implants/implantnanoaug.dm
	code/game/objects/items/weapons/implants/implantpad.dm
	code/game/objects/items/weapons/kitchen.dm
	code/game/objects/items/weapons/manuals.dm
	code/game/objects/items/weapons/medical.dm
	code/game/objects/items/weapons/mops_cleaners.dm
	code/game/objects/items/weapons/papers_bins.dm
	code/game/objects/items/weapons/stunbaton.dm
	code/game/objects/items/weapons/surgery_tools.dm
	code/game/objects/items/weapons/swords_axes_etc.dm
	code/game/objects/items/weapons/table_rack_parts.dm
	code/game/objects/items/weapons/tools.dm
	code/game/objects/items/weapons/twohanded.dm
	code/game/objects/items/weapons/wrappingpaper.dm
	code/game/objects/mineral_doors.dm
	code/game/objects/radio/beacon.dm
	code/game/objects/radio/electropack.dm
	code/game/objects/radio/encryptionkey.dm
	code/game/objects/radio/headset.dm
	code/game/objects/radio/intercom.dm
	code/game/objects/radio/radio.dm
	code/game/objects/secstorage/sbriefcase.dm
	code/game/objects/secstorage/ssafe.dm
	code/game/objects/stacks/glass.dm
	code/game/objects/stacks/metal.dm
	code/game/objects/stacks/stack.dm
	code/game/objects/stacks/wood.dm
	code/game/objects/stool.dm
	code/game/objects/storage/backpack.dm
	code/game/objects/storage/belt.dm
	code/game/objects/storage/bible.dm
	code/game/objects/storage/briefcase.dm
	code/game/objects/storage/lockbox.dm
	code/game/objects/storage/storage.dm
	code/game/objects/storage/uplink_kits.dm
	code/game/objects/structures.dm
	code/game/objects/tables_racks.dm
	code/game/objects/tank.dm
	code/game/objects/tanks/emergency.dm
	code/game/objects/tanks/jetpack.dm
	code/game/objects/toys.dm
	code/game/objects/transfer_valve.dm
	code/game/objects/uplinks.dm
	code/game/objects/watercloset.dm
	code/game/objects/weapons.dm
	code/game/objects/windoor_assembly.dm
	code/game/objects/window.dm
	code/game/prisonshuttle.dm
	code/game/smoothwall.dm
	code/game/sound.dm
	code/game/step_triggers.dm
	code/game/structure/structure.dm
	code/game/supplyshuttle.dm
	code/game/throwing.dm
	code/game/topic.dm
	code/game/turf.dm
	code/game/vehicles/airtight/airtight.dm
	code/game/vehicles/airtight/land.dm
	code/game/vehicles/airtight/space.dm
	code/game/vehicles/vehicle.dm
	code/game/verbs/ooc.dm
	code/game/verbs/sound.dm
	code/game/verbs/suicide.dm
	code/game/verbs/who.dm
	code/game/vote.dm
	code/modules/admin/IsBanned.dm
	code/modules/admin/NewBan.dm
	code/modules/admin/admin.dm
	code/modules/admin/admin_investigate.dm
	code/modules/admin/admin_memo.dm
	code/modules/admin/admin_verbs.dm
	code/modules/admin/banjob.dm
	code/modules/admin/create_mob.dm
	code/modules/admin/create_object.dm
	code/modules/admin/create_turf.dm
	code/modules/admin/player_panel.dm
	code/modules/admin/verbs/MC.dm
	code/modules/admin/verbs/adminhelp.dm
	code/modules/admin/verbs/adminjump.dm
	code/modules/admin/verbs/adminpm.dm
	code/modules/admin/verbs/adminsay.dm
	code/modules/admin/verbs/atmosdebug.dm
	code/modules/admin/verbs/cinematic.dm
	code/modules/admin/verbs/deadsay.dm
	code/modules/admin/verbs/debug.dm
	code/modules/admin/verbs/diagnostics.dm
	code/modules/admin/verbs/getlogs.dm
	code/modules/admin/verbs/mapping.dm
	code/modules/admin/verbs/massmodvar.dm
	code/modules/admin/verbs/modifyvariables.dm
	code/modules/admin/verbs/onlyone.dm
	code/modules/admin/verbs/playsound.dm
	code/modules/admin/verbs/possess.dm
	code/modules/admin/verbs/pray.dm
	code/modules/admin/verbs/randomverbs.dm
	code/modules/admin/verbs/striketeam.dm
	code/modules/admin/verbs/striketeam_syndicate.dm
	code/modules/assembly/assembly.dm
	code/modules/assembly/signaler.dm
	code/modules/chemical/Chemistry-Machinery.dm
	code/modules/chemical/Chemistry-Tools.dm
	code/modules/client/client defines.dm
	code/modules/client/client procs.dm
	code/modules/clothing/costume.dm
	code/modules/clothing/gimmick.dm
	code/modules/clothing/glasses.dm
	code/modules/clothing/glasses/glasses.dm
	code/modules/clothing/glasses/hud.dm
	code/modules/clothing/gloves.dm
	code/modules/clothing/head/hardhat.dm
	code/modules/clothing/jumpsuit.dm
	code/modules/clothing/mask.dm
	code/modules/clothing/shoes.dm
	code/modules/clothing/spacesuit.dm
	code/modules/clothing/spacesuits/captain.dm
	code/modules/clothing/spacesuits/miscellaneous.dm
	code/modules/clothing/spacesuits/ninja.dm
	code/modules/clothing/spacesuits/rig.dm
	code/modules/clothing/spacesuits/syndi.dm
	code/modules/clothing/spacesuits/void.dm
	code/modules/clothing/suit.dm
	code/modules/clothing/suits/armor.dm
	code/modules/clothing/suits/bio.dm
	code/modules/clothing/suits/bomb.dm
	code/modules/clothing/suits/detective.dm
	code/modules/clothing/suits/fire.dm
	code/modules/clothing/suits/heavy.dm
	code/modules/clothing/suits/hos.dm
	code/modules/clothing/suits/labcoat.dm
	code/modules/clothing/suits/miscellaneous.dm
	code/modules/clothing/suits/wiz_robe.dm
	code/modules/clothing/uniforms/lawyer.dm
	code/modules/critters/critter.dm
	code/modules/critters/critter_AI.dm
	code/modules/critters/critters.dm
	code/modules/critters/hivebots/hivebot.dm
	code/modules/flufftext/Dreaming.dm
	code/modules/flufftext/Hallucination.dm
	code/modules/flufftext/TextFilters.dm
	code/modules/food/food.dm
	code/modules/food/meat.dm
	code/modules/food/recipes_microwave.dm
	code/modules/maps/SwapMaps.dm
	code/modules/maps/dmm_suite.dm
	code/modules/maps/fromdmp.dm
	code/modules/maps/randomZlevel.dm
	code/modules/maps/reader.dm
	code/modules/maps/writer.dm
	code/modules/mining/machine_processing.dm
	code/modules/mining/machine_stacking.dm
	code/modules/mining/machine_unloading.dm
	code/modules/mining/mine_items.dm
	code/modules/mining/mine_turfs.dm
	code/modules/mining/mint.dm
	code/modules/mining/ores_materials_coins.dm
	code/modules/mining/satchel_ore_boxdm.dm
	code/modules/mob/dead/death.dm
	code/modules/mob/dead/observer/observer.dm
	code/modules/mob/death.dm
	code/modules/mob/living/blob/blob.dm
	code/modules/mob/living/carbon/alien/alien.dm
	code/modules/mob/living/carbon/alien/death.dm
	code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
	code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm
	code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
	code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm
	code/modules/mob/living/carbon/alien/humanoid/death.dm
	code/modules/mob/living/carbon/alien/humanoid/hud.dm
	code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
	code/modules/mob/living/carbon/alien/humanoid/life.dm
	code/modules/mob/living/carbon/alien/humanoid/login.dm
	code/modules/mob/living/carbon/alien/humanoid/queen.dm
	code/modules/mob/living/carbon/alien/larva/death.dm
	code/modules/mob/living/carbon/alien/larva/hud.dm
	code/modules/mob/living/carbon/alien/larva/larva.dm
	code/modules/mob/living/carbon/alien/larva/life.dm
	code/modules/mob/living/carbon/alien/larva/login.dm
	code/modules/mob/living/carbon/alien/larva/powers.dm
	code/modules/mob/living/carbon/alien/special/_main.dm
	code/modules/mob/living/carbon/alien/special/snakeman.dm
	code/modules/mob/living/carbon/brain/MMI.dm
	code/modules/mob/living/carbon/brain/brain.dm
	code/modules/mob/living/carbon/brain/death.dm
	code/modules/mob/living/carbon/brain/hud.dm
	code/modules/mob/living/carbon/brain/life.dm
	code/modules/mob/living/carbon/brain/say.dm
	code/modules/mob/living/carbon/carbon.dm
	code/modules/mob/living/carbon/human/death.dm
	code/modules/mob/living/carbon/human/emote.dm
	code/modules/mob/living/carbon/human/examine.dm
	code/modules/mob/living/carbon/human/hud.dm
	code/modules/mob/living/carbon/human/human.dm
	code/modules/mob/living/carbon/human/human_attackalien.dm
	code/modules/mob/living/carbon/human/human_attackhand.dm
	code/modules/mob/living/carbon/human/human_damage.dm
	code/modules/mob/living/carbon/human/human_defense.dm
	code/modules/mob/living/carbon/human/life.dm
	code/modules/mob/living/carbon/human/login.dm
	code/modules/mob/living/carbon/human/say.dm
	code/modules/mob/living/carbon/human/whisper.dm
	code/modules/mob/living/carbon/metroid/death.dm
	code/modules/mob/living/carbon/metroid/examine.dm
	code/modules/mob/living/carbon/metroid/life.dm
	code/modules/mob/living/carbon/metroid/login.dm
	code/modules/mob/living/carbon/metroid/metroid.dm
	code/modules/mob/living/carbon/metroid/powers.dm
	code/modules/mob/living/carbon/monkey/death.dm
	code/modules/mob/living/carbon/monkey/examine.dm
	code/modules/mob/living/carbon/monkey/hud.dm
	code/modules/mob/living/carbon/monkey/life.dm
	code/modules/mob/living/carbon/monkey/login.dm
	code/modules/mob/living/carbon/monkey/monkey.dm
	code/modules/mob/living/carbon/monkey/powers.dm
	code/modules/mob/living/damage_procs.dm
	code/modules/mob/living/living.dm
	code/modules/mob/living/living_defense.dm
	code/modules/mob/living/login.dm
	code/modules/mob/living/say.dm
	code/modules/mob/living/silicon/ai/ai.dm
	code/modules/mob/living/silicon/ai/death.dm
	code/modules/mob/living/silicon/ai/examine.dm
	code/modules/mob/living/silicon/ai/life.dm
	code/modules/mob/living/silicon/ai/login.dm
	code/modules/mob/living/silicon/ai/move.dm
	code/modules/mob/living/silicon/death.dm
	code/modules/mob/living/silicon/decoy/death.dm
	code/modules/mob/living/silicon/pai/death.dm
	code/modules/mob/living/silicon/pai/hud.dm
	code/modules/mob/living/silicon/pai/pai.dm
	code/modules/mob/living/silicon/pai/recruit.dm
	code/modules/mob/living/silicon/pai/software.dm
	code/modules/mob/living/silicon/robot/death.dm
	code/modules/mob/living/silicon/robot/emote.dm
	code/modules/mob/living/silicon/robot/examine.dm
	code/modules/mob/living/silicon/robot/hud.dm
	code/modules/mob/living/silicon/robot/life.dm
	code/modules/mob/living/silicon/robot/login.dm
	code/modules/mob/living/silicon/robot/robot.dm
	code/modules/mob/living/silicon/robot/robot_modules.dm
	code/modules/mob/living/silicon/robot/say.dm
	code/modules/mob/living/silicon/robot/wires.dm
	code/modules/mob/living/silicon/say.dm
	code/modules/mob/living/simple_animal/life.dm
	code/modules/mob/login.dm
	code/modules/mob/logout.dm
	code/modules/mob/mob.dm
	code/modules/mob/mob_cleanup.dm
	code/modules/mob/mob_defines.dm
	code/modules/mob/mob_grab.dm
	code/modules/mob/mob_helpers.dm
	code/modules/mob/mob_movement.dm
	code/modules/mob/mob_transformation_simple.dm
	code/modules/mob/new_player/login.dm
	code/modules/mob/new_player/new_player.dm
	code/modules/mob/new_player/preferences.dm
	code/modules/mob/new_player/preferences_setup.dm
	code/modules/mob/new_player/savefile.dm
	code/modules/mob/new_player/sprite_accessories.dm
	code/modules/mob/organ/organ.dm
	code/modules/mob/organ/organ_external.dm
	code/modules/mob/organ/pain.dm
	code/modules/mob/say.dm
	code/modules/mob/screen.dm
	code/modules/mob/simple_animal/crab.dm
	code/modules/mob/transform_procs.dm
	code/modules/paperwork/clipboard.dm
	code/modules/paperwork/filingcabinet.dm
	code/modules/paperwork/folders.dm
	code/modules/paperwork/handlabeler.dm
	code/modules/paperwork/paper.dm
	code/modules/paperwork/paperbin.dm
	code/modules/paperwork/pen.dm
	code/modules/paperwork/photocopier.dm
	code/modules/paperwork/stamps.dm
	code/modules/power/antimatter/computer.dm
	code/modules/power/antimatter/engine.dm
	code/modules/power/antimatter/fuel.dm
	code/modules/power/apc.dm
	code/modules/power/cable.dm
	code/modules/power/cable_heavyduty.dm
	code/modules/power/cell.dm
	code/modules/power/generator.dm
	code/modules/power/generator_type2.dm
	code/modules/power/gravitygenerator.dm
	code/modules/power/lighting.dm
	code/modules/power/port_gen.dm
	code/modules/power/sd_DynamicAreaLighting.dm
	code/modules/power/singularity/collector.dm
	code/modules/power/singularity/containment_field.dm
	code/modules/power/singularity/emitter.dm
	code/modules/power/singularity/field_generator.dm
	code/modules/power/singularity/generator.dm
	code/modules/power/singularity/investigate.dm
	code/modules/power/singularity/particle_accelerator/particle.dm
	code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
	code/modules/power/singularity/particle_accelerator/particle_chamber.dm
	code/modules/power/singularity/particle_accelerator/particle_control.dm
	code/modules/power/singularity/particle_accelerator/particle_emitter.dm
	code/modules/power/singularity/particle_accelerator/particle_power.dm
	code/modules/power/singularity/singularity.dm
	code/modules/power/smes.dm
	code/modules/power/solar.dm
	code/modules/power/switch.dm
	code/modules/power/turbine.dm
	code/modules/projectiles/ammunition.dm
	code/modules/projectiles/gun.dm
	code/modules/projectiles/guns/energy.dm
	code/modules/projectiles/guns/energy/laser.dm
	code/modules/projectiles/guns/energy/nuclear.dm
	code/modules/projectiles/guns/energy/pulse.dm
	code/modules/projectiles/guns/energy/special.dm
	code/modules/projectiles/guns/energy/stun.dm
	code/modules/projectiles/guns/projectile.dm
	code/modules/projectiles/guns/projectile/pistol.dm
	code/modules/projectiles/guns/projectile/revolver.dm
	code/modules/projectiles/guns/projectile/shotgun.dm
	code/modules/projectiles/projectile.dm
	code/modules/projectiles/projectile/beams.dm
	code/modules/projectiles/projectile/bullets.dm
	code/modules/projectiles/projectile/change.dm
	code/modules/projectiles/projectile/special.dm
	code/modules/reagents/Chemistry-Holder.dm
	code/modules/reagents/Chemistry-Reagents.dm
	code/modules/reagents/Chemistry-Recipes.dm
	code/modules/recycling/conveyor2.dm
	code/modules/recycling/disposal-construction.dm
	code/modules/recycling/disposal.dm
	code/modules/recycling/sortingmachinery.dm
	code/modules/research/designs.dm
	code/modules/research/destructive_analyzer.dm
	code/modules/research/message_server.dm
	code/modules/research/protolathe.dm
	code/modules/research/rdconsole.dm
	code/modules/research/rdmachines.dm
	code/modules/research/research.dm
	code/modules/research/server.dm
	code/modules/scripting/AST/Operators/Binary Operators.dm
	code/modules/scripting/Implementations/Telecomms.dm
	code/modules/scripting/Parser/Keywords.dm
	code/modules/scripting/Scanner/Tokens.dm
	code/modules/scripting/stack.dm
	code/modules/security levels/keycard authentication.dm
	code/modules/security levels/security levels.dm
	code/setup.dm
	code/stylesheet.dm
	code/unused/AI_Visibility.dm
	code/unused/Ultralight.dm
	code/unused/airtunnel.dm
	code/unused/beast/bodypart.dm
	code/unused/conveyor.dm
	code/unused/disease2/analyser.dm
	code/unused/disease2/base.dm
	code/unused/disease2/biohazard destroyer.dm
	code/unused/disease2/cureimplanter.dm
	code/unused/disease2/curer.dm
	code/unused/disease2/diseasesplicer.dm
	code/unused/disease2/dishincubator.dm
	code/unused/disease2/isolator.dm
	code/unused/disease2/monkeydispensor.dm
	code/unused/dna.dm
	code/unused/gamemodes/deathmatch.dm
	code/unused/jobs.dm
	code/unused/mining/datum_processing_recipe.dm
	code/unused/mining/spaceship_builder_unused.dm
	code/unused/new_year.dm
	code/unused/spacecraft/manufacturing.dm
	code/unused/spacecraft/shipcore.dm
	config/README feedback.txt
	config/admins.txt
	config/config.txt
	config/rules.html
	data/mode.txt
	html/add-to-changelog.html
	html/archivedchangelog.html
	html/changelog.css
	html/changelog.html
	html/changelog.js
	icons/effects/blood.dmi
	icons/effects/genetics.dmi
	icons/misc/fullscreen.dmi
	icons/mob/AI.dmi
	icons/mob/alien.dmi
	icons/mob/animal.dmi
	icons/mob/back.dmi
	icons/mob/belt.dmi
	icons/mob/blob.dmi
	icons/mob/critter.dmi
	icons/mob/dam_human.dmi
	icons/mob/eyes.dmi
	icons/mob/feet.dmi
	icons/mob/hands.dmi
	icons/mob/head.dmi
	icons/mob/human.dmi
	icons/mob/human_face.dmi
	icons/mob/items_lefthand.dmi
	icons/mob/items_righthand.dmi
	icons/mob/livestock.dmi
	icons/mob/mask.dmi
	icons/mob/mecha.dmi
	icons/mob/mob.dmi
	icons/mob/monkey.dmi
	icons/mob/robots.dmi
	icons/mob/screen1.dmi
	icons/mob/screen1_Midnight.dmi
	icons/mob/screen1_Orange.dmi
	icons/mob/screen1_alien.dmi
	icons/mob/screen1_old.dmi
	icons/mob/suit.dmi
	icons/mob/uniform.dmi
	icons/mob/zone_sel.dmi
	icons/obj/Cryogenic2.dmi
	icons/obj/aibots.dmi
	icons/obj/ammo.dmi
	icons/obj/atmos.dmi
	icons/obj/bureaucracy.dmi
	icons/obj/card.dmi
	icons/obj/cigarettes.dmi
	icons/obj/closet.dmi
	icons/obj/clothing/glasses.dmi
	icons/obj/clothing/gloves.dmi
	icons/obj/clothing/hats.dmi
	icons/obj/clothing/masks.dmi
	icons/obj/clothing/shoes.dmi
	icons/obj/clothing/suits.dmi
	icons/obj/clothing/uniforms.dmi
	icons/obj/computer.dmi
	icons/obj/contraband.dmi
	icons/obj/decals.dmi
	icons/obj/device.dmi
	icons/obj/doors/DoorHazard.dmi
	icons/obj/doors/door_assembly.dmi
	icons/obj/drinks.dmi
	icons/obj/engine.dmi
	icons/obj/food.dmi
	icons/obj/grenade.dmi
	icons/obj/gun.dmi
	icons/obj/harvest.dmi
	icons/obj/hydroponics.dmi
	icons/obj/items.dmi
	icons/obj/janitor.dmi
	icons/obj/library.dmi
	icons/obj/lighting.dmi
	icons/obj/machines/field_generator.dmi
	icons/obj/machines/gateway.dmi
	icons/obj/machines/mining_machines.dmi
	icons/obj/machines/particle_accelerator.dmi
	icons/obj/meter.dmi
	icons/obj/mining.dmi
	icons/obj/objects.dmi
	icons/obj/paper.dmi
	icons/obj/pda.dmi
	icons/obj/pipes/disposal.dmi
	icons/obj/plants.dmi
	icons/obj/power.dmi
	icons/obj/projectiles.dmi
	icons/obj/robotics.dmi
	icons/obj/seeds.dmi
	icons/obj/singularity.dmi
	icons/obj/stationobjs.dmi
	icons/obj/stock_parts.dmi
	icons/obj/storage.dmi
	icons/obj/structures.dmi
	icons/obj/surgery.dmi
	icons/obj/syringe.dmi
	icons/obj/tank.dmi
	icons/obj/terminals.dmi
	icons/obj/toy.dmi
	icons/obj/vending.dmi
	icons/obj/watercloset.dmi
	icons/obj/weapons.dmi
	icons/obj/wizard.dmi
	icons/turf/areas.dmi
	icons/turf/floors.dmi
	icons/turf/walls.dmi
	interface/interface.dm
	interface/skin.dmf
	maps/Antiqua.dmm
	maps/RandomZLevels/assistantChamber.dmm
	maps/RandomZLevels/fileList.txt
	maps/tgstation.2.0.9.dmm
	sound/AI/animes.ogg
	sound/AI/newroundsexy.ogg
	sound/AI/newroundsexy2.ogg
	sound/effects/adminhelp.ogg
	tools/UnstandardnessTestForDM/UnstandardnessTestForDM.sln
	tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Form1.Designer.cs
	tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Form1.cs
	tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Form1.resx
	tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Program.cs
	tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Properties/AssemblyInfo.cs
	tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Properties/Resources.Designer.cs
	tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Properties/Resources.resx
	tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Properties/Settings.Designer.cs
	tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Properties/Settings.settings
	tools/UnstandardnessTestForDM/UnstandardnessTestForDM/UnstandardnessTestForDM.csproj
tools/UnstandardnessTestForDM/UnstandardnessTestForDM/bin/Debug/UnstandardnessTestForDM.vshost.exe.manifest
	tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug/UnstandardnessTestForDM.csproj.FileListAbsolute.txt
	tools/expand_filedir_paths.py
	tools/readme.txt

Signed-off-by: Cael_Aislinn <cael_aislinn@yahoo.com.au>
This commit is contained in:
Cael_Aislinn
2012-08-22 04:00:11 +10:00
1232 changed files with 108006 additions and 78117 deletions
+193
View File
@@ -0,0 +1,193 @@
obj/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = -1, var/reason, var/job = "", var/rounds = 0)
var/user = sqlfdbklogin
var/pass = sqlfdbkpass
var/db = sqlfdbkdb
var/address = sqladdress
var/port = sqlport
var/DBConnection/dbcon = new()
dbcon.Connect("dbi:mysql:[db]:[address]:[port]","[user]","[pass]")
if(!dbcon.IsConnected())
return
var/serverip = "[world.internet_address]:[world.port]"
var/bantype_pass = 0
var/bantype_str
switch(bantype)
if(BANTYPE_PERMA)
bantype_str = "PERMABAN"
duration = -1
bantype_pass = 1
if(BANTYPE_TEMP)
bantype_str = "TEMPBAN"
bantype_pass = 1
if(BANTYPE_JOB_PERMA)
bantype_str = "JOB_PERMABAN"
duration = -1
bantype_pass = 1
if(BANTYPE_JOB_TEMP)
bantype_str = "JOB_TEMPBAN"
bantype_pass = 1
if( !bantype_pass ) return
if( !istext(reason) ) return
if( !isnum(duration) ) return
var/ckey
var/computerid
var/ip
if(ismob(banned_mob))
ckey = banned_mob.ckey
if(banned_mob.client)
computerid = banned_mob.client.computer_id
ip = banned_mob.client.address
var/a_ckey
var/a_computerid
var/a_ip
if(src.owner && istype(src.owner, /client))
a_ckey = src.owner:ckey
a_computerid = src.owner:computer_id
a_ip = src.owner:address
// var/list/client/clients = get_all_clients()
var/who
for(var/client/C in client_list)
if(!who)
who = "[C]"
else
who += ", [C]"
var/list/client/admin_clients = get_all_admin_clients()
var/adminwho
for(var/client/C in admin_clients)
if(!adminwho)
adminwho = "[C]"
else
adminwho += ", [C]"
reason = sql_sanitize_text(reason)
var/sql = "INSERT INTO erro_ban VALUES (null, Now(), '[serverip]', '[bantype_str]', '[reason]', '[job]', [(duration)?"[duration]":"0"], [(rounds)?"[rounds]":"0"], Now() + INTERVAL [(duration>0) ? duration : 0] MINUTE, '[ckey]', '[computerid]', '[ip]', '[a_ckey]', '[a_computerid]', '[a_ip]', '[who]', '[adminwho]', '', null, null, null, null, null)"
var/DBQuery/query_insert = dbcon.NewQuery(sql)
query_insert.Execute()
dbcon.Disconnect()
obj/admins/proc/DB_ban_unban(var/ckey, var/bantype, var/job = "")
var/user = sqlfdbklogin
var/pass = sqlfdbkpass
var/db = sqlfdbkdb
var/address = sqladdress
var/port = sqlport
var/bantype_str
if(bantype)
var/bantype_pass = 0
switch(bantype)
if(BANTYPE_PERMA)
bantype_str = "PERMABAN"
bantype_pass = 1
if(BANTYPE_TEMP)
bantype_str = "TEMPBAN"
bantype_pass = 1
if(BANTYPE_JOB_PERMA)
bantype_str = "JOB_PERMABAN"
bantype_pass = 1
if(BANTYPE_JOB_TEMP)
bantype_str = "JOB_TEMPBAN"
bantype_pass = 1
if(BANTYPE_ANY_FULLBAN)
bantype_str = "ANY"
bantype_pass = 1
if( !bantype_pass ) return
var/bantype_sql
if(bantype_str == "ANY")
bantype_sql = "(bantype = 'PERMABAN' OR (bantype = 'TEMPBAN' AND expiration_time > Now() ) )"
else
bantype_sql = "bantype = '[bantype_str]'"
var/sql = "SELECT id FROM erro_ban WHERE ckey = '[ckey]' AND [bantype_sql] AND (unbanned is null OR unbanned = false)"
if(job)
sql += " AND job = '[job]'"
var/DBConnection/dbcon = new()
dbcon.Connect("dbi:mysql:[db]:[address]:[port]","[user]","[pass]")
if(!dbcon.IsConnected())
return
var/ban_id
var/ban_number = 0 //failsafe
var/DBQuery/query = dbcon.NewQuery(sql)
query.Execute()
while(query.NextRow())
ban_id = query.item[1]
ban_number++;
if(ban_number == 0)
usr << "\red Database update failed due to no bans fitting the search criteria. If this is not a legacy ban you should contact the database admin."
return
if(ban_number > 1)
usr << "\red Database update failed due to multiple bans fitting the search criteria. Note down the ckey, job and current time and contact the database admin."
return
if(istext(ban_id))
ban_id = text2num(ban_id)
if(!isnum(ban_id))
usr << "\red Database update failed due to a ban ID mismatch. Contact the database admin."
return
DB_ban_unban_by_id(ban_id)
obj/admins/proc/DB_ban_unban_by_id(var/id)
var/user = sqlfdbklogin
var/pass = sqlfdbkpass
var/db = sqlfdbkdb
var/address = sqladdress
var/port = sqlport
var/sql = "SELECT id FROM erro_ban WHERE id = [id]"
var/DBConnection/dbcon = new()
dbcon.Connect("dbi:mysql:[db]:[address]:[port]","[user]","[pass]")
if(!dbcon.IsConnected())
return
var/ban_number = 0 //failsafe
var/DBQuery/query = dbcon.NewQuery(sql)
query.Execute()
while(query.NextRow())
ban_number++;
if(ban_number == 0)
usr << "\red Database update failed due to a ban id not being present in the database."
return
if(ban_number > 1)
usr << "\red Database update failed due to multiple bans having the same ID. Contact the database admin."
return
if(!src.owner || !istype(src.owner, /client))
return
var/unban_ckey = src.owner:ckey
var/unban_computerid = src.owner:computer_id
var/unban_ip = src.owner:address
var/sql_update = "UPDATE erro_ban SET unbanned = 1, unbanned_datetime = Now(), unbanned_ckey = '[unban_ckey]', unbanned_computerid = '[unban_computerid]', unbanned_ip = '[unban_ip]' WHERE id = [id]"
var/DBQuery/query_update = dbcon.NewQuery(sql_update)
query_update.Execute()
+12 -4
View File
@@ -1,13 +1,21 @@
//Blocks an attempt to connect before even creating our client datum thing.
world/IsBanned(key,address,computer_id)
// if(ckey(key) in admins)
// return ..()
if(ckey(key) in admins)
return ..()
//Guest Checking
if(IsGuestKey(key))
if( !guests_allowed && IsGuestKey(key) )
log_access("Failed Login: [key] - Guests not allowed")
message_admins("\blue Failed Login: [key] - Guests not allowed")
return list("reason"="guest", "desc"="\nReason: Guests not allowed.brb")
return list("reason"="guest", "desc"="\nReason: Guests not allowed. Please sign in with a byond account.")
//check if the IP address is a known TOR node
if( config && config.ToRban && ToRban_isbanned(address) )
log_access("Failed Login: [src] - Banned: ToR")
message_admins("\blue Failed Login: [src] - Banned: ToR")
//ban their computer_id and ckey for posterity
AddBan(ckey(key), computer_id, "Use of ToR", "Automated Ban", 0, 0)
return list("reason"="Using ToR", "desc"="\nReason: The network you are using to connect has been banned.\nIf you believe this is a mistake, please request help at [config.banappeals]")
//Ban Checking
. = CheckBan( ckey(key), computer_id, address )
+35 -21
View File
@@ -16,11 +16,11 @@ var/savefile/Banlist
if( "[ckey][id]" in Banlist.dir )
Banlist.cd = "[ckey][id]"
if (Banlist["temp"])
if (!GetBanExp(Banlist["minutes"]))
if (!GetExp(Banlist["minutes"]))
ClearTempbans()
return 0
else
.["desc"] = "\nReason: [Banlist["reason"]]\nExpires: [GetBanExp(Banlist["minutes"])]\nBy: [Banlist["bannedby"]][appeal]"
.["desc"] = "\nReason: [Banlist["reason"]]\nExpires: [GetExp(Banlist["minutes"])]\nBy: [Banlist["bannedby"]][appeal]"
else
Banlist.cd = "/base/[ckey][id]"
.["desc"] = "\nReason: [Banlist["reason"]]\nExpires: <B>PERMENANT</B>\nBy: [Banlist["bannedby"]][appeal]"
@@ -32,22 +32,22 @@ var/savefile/Banlist
var/matches
if( ckey == Banlist["key"] )
matches += "ckey"
if( id == Banlist["id"] && Banlist["skipIdCheck"] == 0)
if( id == Banlist["id"] )
if(matches)
matches += "/"
matches += "id"
// if( address == Banlist["ip"] )
// if(matches)
// matches += "/"
// matches += "ip"
if( address == Banlist["ip"] )
if(matches)
matches += "/"
matches += "ip"
if(matches)
if(Banlist["temp"])
if (!GetBanExp(Banlist["minutes"]))
if (!GetExp(Banlist["minutes"]))
ClearTempbans()
return 0
else
.["desc"] = "\nReason: [Banlist["reason"]]\nExpires: [GetBanExp(Banlist["minutes"])]\nBy: [Banlist["bannedby"]][appeal]"
.["desc"] = "\nReason: [Banlist["reason"]]\nExpires: [GetExp(Banlist["minutes"])]\nBy: [Banlist["bannedby"]][appeal]"
else
.["desc"] = "\nReason: [Banlist["reason"]]\nExpires: <B>PERMENANT</B>\nBy: [Banlist["bannedby"]][appeal]"
.["reason"] = matches
@@ -68,8 +68,9 @@ var/savefile/Banlist
if (!Banlist.dir.Find("base"))
log_admin("Banlist missing base dir.")
Banlist.dir.Add("base")
Banlist.cd = "/base"
Banlist.cd = "/base"
else if (Banlist.dir.Find("base"))
Banlist.cd = "/base"
ClearTempbans()
return 1
@@ -92,7 +93,7 @@ var/savefile/Banlist
return 1
/proc/AddBan(ckey, computerid, reason, bannedby, temp, minutes)
/proc/AddBan(ckey, computerid, reason, bannedby, temp, minutes, address)
var/bantimestamp
@@ -109,13 +110,13 @@ var/savefile/Banlist
Banlist.cd = "/base/[ckey][computerid]"
Banlist["key"] << ckey
Banlist["id"] << computerid
Banlist["skipIdCheck"] << 0
Banlist["ip"] << address
Banlist["reason"] << reason
Banlist["bannedby"] << bannedby
Banlist["temp"] << temp
if (temp)
Banlist["minutes"] << bantimestamp
notes_add(ckey, "Banned - [reason]")
return 1
/proc/RemoveBan(foldername)
@@ -124,6 +125,7 @@ var/savefile/Banlist
Banlist.cd = "/base/[foldername]"
Banlist["key"] >> key
Banlist["id"] >> id
Banlist.cd = "/base"
if (!Banlist.dir.Remove(foldername)) return 0
@@ -136,17 +138,17 @@ var/savefile/Banlist
log_admin("[key_name_admin(usr)] unbanned [key]")
message_admins("[key_name_admin(usr)] unbanned: [key]")
feedback_inc("ban_unban",1)
usr.client.holder.DB_ban_unban( ckey(key), BANTYPE_ANY_FULLBAN)
for (var/A in Banlist.dir)
Banlist.cd = "/base/[A]"
if (key == Banlist["key"] || id == Banlist["id"])
if (key == Banlist["key"] /*|| id == Banlist["id"]*/)
Banlist.cd = "/base"
Banlist.dir.Remove(A)
continue
return 1
/proc/GetBanExp(minutes as num)
/proc/GetExp(minutes as num)
UpdateTime()
var/exp = minutes - CMinutes
if (exp <= 0)
@@ -169,15 +171,27 @@ var/savefile/Banlist
for (var/A in Banlist.dir)
count++
Banlist.cd = "/base/[A]"
dat += text("<tr><td><A href='?src=\ref[src];unban_del=[Banlist["key"]][Banlist["id"]]'>(U)</A><A href='?src=\ref[src];unban_edit=[Banlist["key"]][Banlist["id"]]'>(E)</A><A href='?src=\ref[src];unban_cid=[Banlist["key"]][Banlist["id"]]'>(K)</A> Key: <B>[Banlist["key"]]</B></td><td> ([Banlist["temp"] ? "[GetBanExp(Banlist["minutes"]) ? GetBanExp(Banlist["minutes"]) : "Removal pending" ]" : "Permaban"])</td><td>(By: [Banlist["bannedby"]])</td><td>(Reason: [Banlist["reason"]])</td></tr>")
var/ref = "\ref[src]"
var/key = Banlist["key"]
var/id = Banlist["id"]
var/ip = Banlist["ip"]
var/reason = Banlist["reason"]
var/by = Banlist["bannedby"]
var/expiry
if(Banlist["temp"])
expiry = GetExp(Banlist["minutes"])
if(!expiry) expiry = "Removal Pending"
else expiry = "Permaban"
dat += text("<tr><td><A href='?src=[ref];unbanf=[key][id]'>(U)</A><A href='?src=[ref];unbane=[key][id]'>(E)</A> Key: <B>[key]</B></td><td>ComputerID: <B>[id]</B></td><td>IP: <B>[ip]</B></td><td> [expiry]</td><td>(By: [by])</td><td>(Reason: [reason])</td></tr>")
dat += "</table>"
dat = "<HR><B>Bans:</B> <FONT COLOR=blue>(U) = Unban , (E) = Edit Ban , (K) = Remove Computer ID</FONT> - <FONT COLOR=green>([count] Bans)</FONT><HR><table border=1 rules=all frame=void cellspacing=0 cellpadding=3 >[dat]"
dat = "<HR><B>Bans:</B> <FONT COLOR=blue>(U) = Unban , (E) = Edit Ban</FONT> - <FONT COLOR=green>([count] Bans)</FONT><HR><table border=1 rules=all frame=void cellspacing=0 cellpadding=3 >[dat]"
usr << browse(dat, "window=unbanp;size=875x400")
//////////////////////////////////// DEBUG ////////////////////////////////////
/*/proc/CreateBans()
/proc/CreateBans()
UpdateTime()
@@ -209,5 +223,5 @@ var/savefile/Banlist
/proc/ClearAllBans()
Banlist.cd = "/base"
for (var/A in Banlist.dir)
RemoveBan(A)*/
RemoveBan(A)
+90
View File
@@ -0,0 +1,90 @@
//By Carnwennan
//fetches an external list and processes it into a list of ip addresses.
//It then stores the processed list into a savefile for later use
#define TORFILE "data/ToR_ban.bdb"
#define TOR_UPDATE_INTERVAL 216000 //~6 hours
/proc/ToRban_isbanned(var/ip_address)
var/savefile/F = new(TORFILE)
if(F)
if( ip_address in F.dir )
return 1
return 0
/proc/ToRban_autoupdate()
var/savefile/F = new(TORFILE)
if(F)
var/last_update
F["last_update"] >> last_update
if((last_update + TOR_UPDATE_INTERVAL) < world.realtime) //we haven't updated for a while
ToRban_update()
return
/proc/ToRban_update()
spawn(0)
diary << "Downloading updated ToR data..."
var/http[] = world.Export("http://exitlist.torproject.org/exit-addresses")
var/rawtext = file2text(http["CONTENT"])
if(rawtext)
var/list/rawlist = tg_text2list(rawtext,"\n")
if(rawlist.len)
fdel(TORFILE)
var/savefile/F = new(TORFILE)
for( var/line in rawlist )
if(!line) continue
if( copytext(line,1,12) == "ExitAddress" )
var/cleaned = copytext(line,13,length(line)-19)
if(!cleaned) continue
F[cleaned] << 1
F["last_update"] << world.realtime
diary << "ToR data updated!"
if(usr) usr << "ToRban updated."
return 1
diary << "ToR data update aborted: no data."
return 0
/client/proc/ToRban(task in list("update","toggle","show","remove","remove all","find"))
set name = "ToRban"
set category = "Server"
if(!holder) return
switch(task)
if("update")
ToRban_update()
if("toggle")
if(config)
if(config.ToRban)
config.ToRban = 0
message_admins("<font color='red'>ToR banning disabled.</font>")
else
config.ToRban = 1
message_admins("<font colot='green'>ToR banning enabled.</font>")
if("show")
var/savefile/F = new(TORFILE)
var/dat
if( length(F.dir) )
for( var/i=1, i<=length(F.dir), i++ )
dat += "<tr><td>#[i]</td><td> [F.dir[i]]</td></tr>"
dat = "<table width='100%'>[dat]</table>"
else
dat = "No addresses in list."
src << browse(dat,"window=ToRban_show")
if("remove")
var/savefile/F = new(TORFILE)
var/choice = input(src,"Please select an IP address to remove from the ToR banlist:","Remove ToR ban",null) as null|anything in F.dir
if(choice)
F.dir.Remove(choice)
src << "<b>Address removed</b>"
if("remove all")
src << "<b>[TORFILE] was [fdel(TORFILE)?"":"not "]removed.</b>"
if("find")
var/input = input(src,"Please input an IP address to search for:","Find ToR ban",null) as null|text
if(input)
if(ToRban_isbanned(input))
src << "<font color='green'><b>Address is a known ToR address</b></font>"
else
src << "<font color='red'><b>Address is not a known ToR address</b></font>"
return
#undef TORFILE
#undef TOR_UPDATE_INTERVAL
File diff suppressed because it is too large Load Diff
+3 -1
View File
@@ -22,7 +22,7 @@
F << "<small>[time2text(world.timeofday,"hh:mm")] \ref[src] ([x],[y],[z])</small> || [src] [message]<br>"
//ADMINVERBS
/client/proc/investigate_show( subject in list("hrefs","singulo") )
/client/proc/investigate_show( subject in list("hrefs","notes","singulo") )
set name = "Investigate"
set category = "Admin"
if(!holder) return
@@ -44,3 +44,5 @@
else
src << "<font color='red'>Error: admin_investigate: Href Logging is not on.</font>"
return
if("notes")
holder.notes_show()
+4 -1
View File
@@ -5,7 +5,7 @@
/client/proc/admin_memo(task in list("write","show","delete"))
set name = "Memo"
set category = "Server"
if(!holder) return
if(!holder || !ENABLE_MEMOS) return
switch(task)
if("write")
admin_memo_write()
@@ -52,3 +52,6 @@
if(ckey)
F.dir.Remove(ckey)
src << "<b>Removed Memo created by [ckey].</b>"
#undef MEMOFILE
#undef ENABLE_MEMOS
+119 -334
View File
@@ -93,9 +93,6 @@
del(src)
return
if ("Retired Admin")
holder.level = -3
else
del(holder)
return
@@ -107,35 +104,48 @@
if (holder.level >= -1)
verbs += /client/proc/investigate_show
verbs += /client/proc/cmd_admin_say
verbs += /client/proc/cmd_mod_say
verbs += /client/proc/cmd_admin_gib_self
verbs += /client/proc/update_mob_sprite
verbs += /client/proc/deadmin_self
else if (holder.level == -3) // Retired Admin
verbs += /client/proc/cmd_admin_say
verbs += /client/proc/cmd_mod_say
return
else return
//Moderator
if (holder.level >= 0)
verbs += /obj/admins/proc/announce
verbs += /obj/admins/proc/startnow
verbs += /obj/admins/proc/toggleAI //Toggle the AI
verbs += /obj/admins/proc/toggleenter //Toggle enterting
verbs += /obj/admins/proc/toggleguests //Toggle guests entering
verbs += /obj/admins/proc/toggleooc //toggle ooc
verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc
verbs += /obj/admins/proc/voteres //toggle votes
verbs += /obj/admins/proc/vmode
verbs += /obj/admins/proc/votekill
verbs += /obj/admins/proc/show_player_panel
verbs += /client/proc/deadchat //toggles deadchat
//verbs += /client/proc/cmd_admin_mute --was never used (according to stats trackind) - use show player panel --erro
verbs += /client/proc/cmd_admin_pm_context
verbs += /client/proc/cmd_admin_pm_panel
verbs += /client/proc/cmd_admin_subtle_message
//verbs += /client/proc/warn - was never used
verbs += /client/proc/dsay
verbs += /client/proc/admin_play
verbs += /client/proc/admin_observe
verbs += /client/proc/game_panel
verbs += /client/proc/player_panel
verbs += /client/proc/player_panel_new
verbs += /client/proc/unban_panel
verbs += /client/proc/jobbans
verbs += /client/proc/unjobban_panel
verbs += /client/proc/voting
verbs += /client/proc/hide_verbs
verbs += /client/proc/general_report
verbs += /client/proc/air_report
verbs += /client/proc/deadmin_self
verbs += /client/proc/Report
verbs += /client/proc/display_admin_reports
verbs += /obj/admins/proc/show_skills
verbs += /client/proc/check_ai_laws
//verbs += /client/proc/cmd_admin_prison --Merged with player panel
//verbs += /obj/admins/proc/unprison --Merged with player panel
else return
if(holder.level == 0) //Moderators don't get asay, only msay
verbs -= /client/proc/cmd_admin_say
verbs -= /client/proc/investigate_show
verbs -= /client/proc/cmd_admin_gib_self
verbs += /client/proc/mod_panel
//Temporary Admin
if (holder.level >= 1)
verbs += /obj/admins/proc/delay //game start delay
@@ -147,36 +157,6 @@
verbs += /client/proc/toggle_hear_radio
verbs += /client/proc/deadmin_self
//verbs += /client/proc/cmd_admin_attack_log --Merged with view variables
verbs += /client/proc/cmd_admin_change_custom_event
//
//MOVED FROM MODERATOR
//
verbs += /client/proc/cmd_admin_subtle_message
verbs += /obj/admins/proc/announce
verbs += /obj/admins/proc/startnow
verbs += /obj/admins/proc/toggleAI //Toggle the AI
verbs += /obj/admins/proc/toggleenter //Toggle enterting
// verbs += /obj/admins/proc/toggleguests //Toggle guests entering
verbs += /obj/admins/proc/toggleooc //toggle ooc
verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc
verbs += /obj/admins/proc/voteres //toggle votes
verbs += /obj/admins/proc/vmode
verbs += /obj/admins/proc/votekill
verbs += /client/proc/deadchat //toggles deadchat
//verbs += /client/proc/cmd_admin_mute --was never used (according to stats trackind) - use show player panel --erro
verbs += /client/proc/dsay
verbs += /client/proc/game_panel
verbs += /obj/admins/proc/show_player_panel
// verbs += /client/proc/player_panel
verbs += /client/proc/player_panel_new
verbs += /client/proc/unban_panel
verbs += /client/proc/jobbans
verbs += /client/proc/voting
verbs += /client/proc/general_report
//verbs += /client/proc/air_report
//verbs += /client/proc/cmd_admin_prison --Merged with player panel
//verbs += /obj/admins/proc/unprison --Merged with player panel
verbs += /client/proc/playernotes
else return
//Admin Candidate
@@ -207,14 +187,11 @@
verbs += /client/proc/spawn_xeno
verbs += /client/proc/toggleprayers
verbs += /client/proc/deadmin_self
verbs += /client/proc/tension_report
verbs += /client/proc/toggleadminhelpsound
verbs += /proc/possess
verbs += /proc/release
verbs += /client/proc/make_tajaran
verbs += /client/proc/admin_deny_shuttle
verbs += /client/proc/cmd_admin_christmas
verbs += /client/proc/editappear
else return
//Badmin
@@ -223,7 +200,6 @@
verbs += /obj/admins/proc/adspawn //toggle admin item spawning
verbs += /client/proc/debug_variables
verbs += /client/proc/cmd_modify_ticker_variables
verbs += /client/proc/cmd_modify_ref_variables
verbs += /client/proc/Debug2 //debug toggle switch
verbs += /client/proc/toggle_view_range
verbs += /client/proc/Getmob
@@ -233,7 +209,6 @@
verbs += /client/proc/jumptokey
verbs += /client/proc/jumptomob
verbs += /client/proc/jumptoturf
verbs += /client/proc/Open_Minimap
verbs += /client/proc/cmd_admin_delete
verbs += /client/proc/cmd_admin_add_freeform_ai_law
verbs += /client/proc/cmd_admin_add_random_ai_law
@@ -241,6 +216,7 @@
verbs += /client/proc/hide_most_verbs
verbs += /client/proc/jumptocoord
verbs += /client/proc/deadmin_self
verbs += /client/proc/giveruntimelog //used by coders to retrieve runtime logs
//verbs += /client/proc/cmd_admin_godmode --Merged with view variables
//verbs += /client/proc/cmd_admin_gib --Merged with view variables
//verbs += /proc/togglebuildmode --Merged with view variables
@@ -255,67 +231,57 @@
verbs += /client/proc/cmd_admin_list_open_jobs
verbs += /client/proc/cmd_admin_direct_narrate
verbs += /client/proc/colorooc
verbs += /client/proc/kill_air
verbs += /client/proc/cmd_admin_world_narrate
verbs += /client/proc/cmd_debug_del_all
verbs += /client/proc/cmd_debug_tog_aliens
// verbs += /client/proc/mapload
verbs += /client/proc/check_words
verbs += /client/proc/drop_bomb
//verbs += /client/proc/kill_airgroup
verbs += /client/proc/kill_airgroup
//verbs += /client/proc/cmd_admin_drop_everything --Merged with view variables
verbs += /client/proc/make_sound
verbs += /client/proc/play_local_sound
verbs += /client/proc/send_space_ninja
verbs += /client/proc/restartcontroller //Can call via aproccall --I_hate_easy_things.jpg, Mport --Agouri
verbs += /client/proc/Blobize //I need to remember to move/remove this later
verbs += /client/proc/Blobcount //I need to remember to move/remove this later
verbs += /client/proc/toggle_clickproc //TODO ERRORAGE (Temporary proc while the new clickproc is being tested)
verbs += /client/proc/toggle_gravity_on
verbs += /client/proc/toggle_gravity_off
verbs += /client/proc/toggle_random_events
verbs += /client/proc/deadmin_self
if(ENABLE_MEMOS) verbs += /client/proc/admin_memo
verbs += /client/proc/Set_Holiday //Force-set a Holiday
verbs += /client/proc/admin_memo
verbs += /client/proc/ToRban //ToRban frontend to access its features.
//verbs += /client/proc/cmd_mass_modify_object_variables --Merged with view variables
//verbs += /client/proc/cmd_admin_explosion --Merged with view variables
//verbs += /client/proc/cmd_admin_emp --Merged with view variables
//verbs += /client/proc/give_spell --Merged with view variables
//verbs += /client/proc/cmd_admin_ninjafy --Merged with view variables
//verbs += /client/proc/cmd_switch_radio --removed as tcommsat is staying
// Moved over from tg's Game Master:
verbs += /obj/admins/proc/toggle_aliens //toggle aliens
verbs += /obj/admins/proc/toggle_space_ninja //toggle ninjas
verbs += /client/proc/triple_ai
verbs += /client/proc/object_talk
verbs += /client/proc/strike_team
verbs += /client/proc/admin_invis
verbs += /client/proc/cmd_admin_godmode
verbs += /client/proc/delbook
verbs += /client/proc/Force_Event_admin
verbs += /client/proc/radioalert
verbs += /client/proc/CarbonCopy
verbs += /client/proc/kill_air //formerly game masters only. this should help for zas debugging while we're having these issues
//verbs += /client/proc/jump_to_dead_group
else return
//Game Master
if (holder.level >= 6)
verbs += /obj/admins/proc/toggle_aliens //toggle aliens
verbs += /obj/admins/proc/toggle_space_ninja //toggle ninjas
verbs += /obj/admins/proc/adjump
verbs += /client/proc/callproc
verbs += /client/proc/triple_ai
verbs += /client/proc/get_admin_state
verbs += /client/proc/reload_admins
verbs += /client/proc/cmd_debug_make_powernets
verbs += /client/proc/object_talk
verbs += /client/proc/strike_team
verbs += /client/proc/enable_debug_verbs
verbs += /client/proc/everyone_random
verbs += /client/proc/only_one
verbs += /client/proc/deadmin_self
verbs += /client/proc/giveruntimelog //used by coders to retrieve runtime logs
verbs += /client/proc/cinematic //show a cinematic sequence
verbs += /client/proc/startSinglo //Used to prevent the station from losing power while testing stuff out.
verbs += /client/proc/toggle_log_hrefs
verbs += /client/proc/enable_debug_verbs
verbs += /client/proc/callprocgen
verbs += /client/proc/callprocobj
verbs += /client/proc/rnd_check_designs
verbs += /client/proc/CarbonCopy
verbs += /client/proc/cmd_debug_mob_lists
else return
return
@@ -329,7 +295,7 @@
verbs -= /obj/admins/proc/startnow
verbs -= /obj/admins/proc/toggleAI //Toggle the AI
verbs -= /obj/admins/proc/toggleenter //Toggle enterting
// verbs -= /obj/admins/proc/toggleguests //Toggle guests entering
verbs -= /obj/admins/proc/toggleguests //Toggle guests entering
verbs -= /obj/admins/proc/toggleooc //toggle ooc
verbs -= /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc
verbs -= /obj/admins/proc/voteres //toggle votes
@@ -406,56 +372,46 @@
verbs -= /client/proc/cmd_admin_pm_context
verbs -= /client/proc/cmd_admin_pm_panel
verbs -= /client/proc/cmd_admin_say
verbs -= /client/proc/cmd_mod_say
verbs -= /client/proc/cmd_admin_subtle_message
//verbs -= /client/proc/warn
verbs -= /client/proc/dsay
verbs -= /client/proc/admin_play
verbs -= /client/proc/admin_observe
verbs -= /client/proc/game_panel
// verbs -= /client/proc/player_panel
verbs -= /client/proc/player_panel
verbs -= /client/proc/unban_panel
verbs -= /client/proc/jobbans
verbs -= /client/proc/unjobban_panel
verbs -= /client/proc/voting
verbs -= /client/proc/hide_verbs
verbs -= /client/proc/general_report
//verbs -= /client/proc/air_report
verbs -= /client/proc/air_report
verbs -= /client/proc/cmd_admin_say
verbs -= /client/proc/cmd_admin_gib_self
verbs -= /client/proc/update_mob_sprite
verbs -= /client/proc/restartcontroller
verbs -= /client/proc/play_local_sound
verbs -= /client/proc/enable_debug_verbs
verbs -= /client/proc/toggleprayers
verbs -= /client/proc/Blobize
verbs -= /client/proc/Blobcount
verbs -= /client/proc/toggle_clickproc //TODO ERRORAGE (Temporary proc while the enw clickproc is being tested)
verbs -= /client/proc/toggle_hear_deadcast
verbs -= /client/proc/toggle_hear_radio
verbs -= /client/proc/tension_report
verbs -= /client/proc/player_panel_new
verbs -= /client/proc/mod_panel
verbs -= /client/proc/toggle_gravity_on
verbs -= /client/proc/toggle_gravity_off
verbs -= /client/proc/toggle_random_events
verbs -= /client/proc/deadmin_self
verbs -= /client/proc/jumptocoord
verbs -= /client/proc/everyone_random
verbs -= /client/proc/Set_Holiday
verbs -= /client/proc/giveruntimelog //used by coders to retrieve runtime logs
verbs -= /client/proc/getserverlog
verbs -= /client/proc/cinematic //show a cinematic sequence
verbs -= /client/proc/admin_memo
verbs -= /client/proc/investigate_show //investigate in-game mishaps using various logs.
verbs -= /client/proc/toggle_log_hrefs
verbs -= /client/proc/cmd_admin_change_custom_event
verbs -= /client/proc/admin_invis
verbs -= /client/proc/callprocgen
verbs -= /client/proc/callprocobj
verbs -= /client/proc/cmd_admin_godmode
verbs -= /client/proc/delbook
verbs -= /client/proc/Force_Event_admin
verbs -= /client/proc/radioalert
verbs -= /client/proc/rnd_check_designs
verbs -= /client/proc/CarbonCopy
verbs -= /client/proc/cmd_modify_ref_variables
verbs -= /client/proc/ToRban
verbs -= /proc/possess
verbs -= /proc/release
//verbs -= /client/proc/give_spell --Merged with view variables
@@ -472,16 +428,10 @@
//verbs -= /obj/admins/proc/unprison --Merged with player panel
//verbs -= /client/proc/cmd_switch_radio --removed because tcommsat is staying
verbs -= /client/proc/togglebuildmodeself
//verbs -= /client/proc/kill_airgroup
verbs -= /client/proc/kill_airgroup
verbs -= /client/proc/debug_master_controller
verbs -= /client/proc/make_tajaran
verbs -= /client/proc/admin_deny_shuttle
verbs -= /client/proc/cmd_admin_christmas
verbs -= /client/proc/editappear
//verbs -= /client/proc/jump_to_dead_group
verbs -= /client/proc/playernotes
verbs -= /obj/admins/proc/show_skills
verbs -= /client/proc/enable_debug_verbs
verbs -= /client/proc/check_ai_laws
verbs -= /client/proc/cmd_debug_mob_lists
return
@@ -500,10 +450,9 @@
holder.state = 2
update_admins(rank)
if(!istype(mob, /mob/dead/observer))
mob.admin_observing = 1
mob.adminghostize(1)
mob.ghostize(1)
src << "\blue You are now observing"
// feedback_add_details("admin_verb","O") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","O") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/admin_play()
set category = "Admin"
@@ -519,47 +468,40 @@
holder.state = 1
update_admins(rank)
if(istype(mob, /mob/dead/observer))
mob:reenter_corpse()
var/mob/dead/observer/ghost = mob
ghost.can_reenter_corpse = 1 //just in-case.
ghost.reenter_corpse()
deadchat = 0
src << "\blue You are now playing"
// feedback_add_details("admin_verb","P") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","P") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/get_admin_state()
set name = "Get Admin State"
set category = "Debug"
for(var/mob/M in world)
if(M.client && M.client.holder)
if(M.client.holder.state == 1)
src << "[M.key] is playing - [M.client.holder.state]"
else if(M.client.holder.state == 2)
src << "[M.key] is observing - [M.client.holder.state]"
else
src << "[M.key] is undefined - [M.client.holder.state]"
// feedback_add_details("admin_verb","GAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
for(var/client/C in admin_list)
if(C.holder.state == 1)
src << "[C.key] is playing - [C.holder.state]"
else if(C.holder.state == 2)
src << "[C.key] is observing - [C.holder.state]"
else
src << "[C.key] is undefined - [C.holder.state]"
feedback_add_details("admin_verb","GAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/*
/client/proc/player_panel()
set name = "Player Panel-Old"
set category = "Admin"
if(holder)
holder.player_panel_old()
// feedback_add_details("admin_verb","PP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
*/
/client/proc/player_panel_new()
set name = "Player Panel"
set category = "Admin"
if(holder)
holder.player_panel_new()
// feedback_add_details("admin_verb","PPN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
holder.player_panel_old()
feedback_add_details("admin_verb","PP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
/client/proc/mod_panel()
set name = "Moderator Panel"
/client/proc/player_panel_new()
set name = "Player Panel New"
set category = "Admin"
if(holder)
holder.mod_panel()
// feedback_add_details("admin_verb","MP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
holder.player_panel_new()
feedback_add_details("admin_verb","PPN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
/client/proc/check_antagonists()
@@ -568,15 +510,15 @@
if(holder)
holder.check_antagonists()
log_admin("[key_name(usr)] checked antagonists.") //for tsar~
//feedback_add_details("admin_verb","CHA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","CHA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
/client/proc/jobbans()
set name = "Unjobban Panel"
set name = "Display Job bans"
set category = "Admin"
if(holder)
holder.Jobbans()
// feedback_add_details("admin_verb","VJB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","VJB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
/client/proc/unban_panel()
@@ -584,7 +526,7 @@
set category = "Admin"
if(holder)
holder.unbanpanel()
// feedback_add_details("admin_verb","UBP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","UBP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
/client/proc/game_panel()
@@ -592,7 +534,7 @@
set category = "Admin"
if(holder)
holder.Game()
// feedback_add_details("admin_verb","GP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","GP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
/client/proc/secrets()
@@ -600,7 +542,7 @@
set category = "Admin"
if (holder)
holder.Secrets()
// feedback_add_details("admin_verb","S") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","S") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
/client/proc/voting()
@@ -608,13 +550,13 @@
set category = "Admin"
if (holder)
holder.Voting()
// feedback_add_details("admin_verb","VO") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","VO") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/colorooc()
set category = "Fun"
set name = "OOC Text Color"
ooccolor = input(src, "Please select your OOC colour.", "OOC colour") as color
// feedback_add_details("admin_verb","OC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","OC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
/client/proc/stealth()
@@ -637,21 +579,13 @@
fakekey = null
log_admin("[key_name(usr)] has turned stealth mode [stealth ? "ON" : "OFF"]")
message_admins("[key_name_admin(usr)] has turned stealth mode [stealth ? "ON" : "OFF"]", 1)
// feedback_add_details("admin_verb","SM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","SM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/playernotes()
set name = "Show Player Info"
set category = "Admin"
if(holder)
holder.PlayerNotes()
return
#define AUTOBANTIME 10
/client/proc/warn(var/mob/M in world)
set category = "Special Verbs"
#define AUTOBATIME 10
/client/proc/warn(var/mob/M in player_list)
/*set category = "Special Verbs"
set name = "Warn"
// If you've edited AUTOBANTIME, change the below desc.
set desc = "Warn a player. If player is already warned, they will be autobanned for 10 minutes."
set desc = "Warn a player"*/ //Based on the information I gathered via stat logging this verb was not used. Use the show player panel alternative. --erro
if(!holder)
src << "Only administrators may use this command."
return
@@ -663,16 +597,16 @@
M.client.warned = 1
message_admins("\blue [ckey] warned [M.ckey].")
else
AddBan(M.ckey, M.computer_id, "Autobanning due to previous warn", ckey, 1, AUTOBANTIME)
AddBan(M.ckey, M.computer_id, "Autobanning due to previous warn", ckey, 1, AUTOBATIME)
M << "\red<BIG><B>You have been autobanned by [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("[ckey] warned [M.ckey], resulting in a [AUTOBANTIME] minute autoban.")
ban_unban_log_save("[ckey] warned [M.ckey], resulting in a [AUTOBANTIME] minute autoban.")
message_admins("\blue [ckey] warned [M.ckey], resulting in a [AUTOBANTIME] minute autoban.")
//feedback_inc("ban_warn",1)
M << "\red This is a temporary ban; it will automatically be removed in [AUTOBATIME] minutes."
log_admin("[ckey] warned [M.ckey], resulting in a [AUTOBATIME] minute autoban.")
ban_unban_log_save("[ckey] warned [M.ckey], resulting in a [AUTOBATIME] minute autoban.")
message_admins("\blue [ckey] warned [M.ckey], resulting in a [AUTOBATIME] minute autoban.")
feedback_inc("ban_warn",1)
del(M.client)
// feedback_add_details("admin_verb","WARN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","WARN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/drop_bomb() // Some admin dickery that can probably be done better -- TLE
@@ -699,16 +633,16 @@
var/flash_range = input("Flash range (in tiles):") as num
explosion(epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range)
message_admins("\blue [ckey] creating an admin explosion at [epicenter.loc].")
// feedback_add_details("admin_verb","DB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","DB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/give_spell(mob/T as mob in world) // -- Urist
/client/proc/give_spell(mob/T as mob in mob_list) // -- Urist
set category = "Fun"
set name = "Give Spell"
set desc = "Gives a spell to a mob."
var/obj/effect/proc_holder/spell/S = input("Choose the spell to give to that guy", "ABRAKADABRA") as null|anything in spells
if(!S) return
T.spell_list += new S
// feedback_add_details("admin_verb","GS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","GS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] gave [key_name(T)] the spell [S].")
message_admins("\blue [key_name_admin(usr)] gave [key_name(T)] the spell [S].", 1)
@@ -724,7 +658,7 @@
V.show_message(message, 2)
log_admin("[key_name(usr)] made [O] at [O.x], [O.y], [O.z]. make a sound")
message_admins("\blue [key_name_admin(usr)] made [O] at [O.x], [O.y], [O.z]. make a sound", 1)
// feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/togglebuildmodeself()
@@ -732,7 +666,7 @@
set category = "Special Verbs"
if(src.mob)
togglebuildmode(src.mob)
// feedback_add_details("admin_verb","TBMS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","TBMS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/toggleadminhelpsound()
@@ -743,7 +677,7 @@
usr << "You will now hear a sound when adminhelps arrive"
else
usr << "You will no longer hear a sound when adminhelps arrive"
// feedback_add_details("admin_verb","AHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","AHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/object_talk(var/msg as text) // -- TLE
set category = "Special Verbs"
@@ -754,7 +688,7 @@
return
for (var/mob/V in hearers(mob.control_object))
V.show_message("<b>[mob.control_object.name]</b> says: \"" + msg + "\"", 2)
// feedback_add_details("admin_verb","OT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","OT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/kill_air() // -- TLE
set category = "Debug"
@@ -766,8 +700,8 @@
else
kill_air = 1
usr << "<b>Disabled air processing.</b>"
// feedback_add_details("admin_verb","KA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] used 'kill air' (toggle), kill_air: [kill_air].")
feedback_add_details("admin_verb","KA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] used 'kill air'.")
message_admins("\blue [key_name_admin(usr)] used 'kill air'.", 1)
/client/proc/show_verbs()
@@ -779,7 +713,7 @@
clear_admin_verbs()
update_admins(holder.rank)
deadchat = temp
// feedback_add_details("admin_verb","TAVVS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","TAVVS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/toggle_clickproc() //TODO ERRORAGE (This is a temporary verb here while I test the new clicking proc)
set name = "Toggle NewClickProc"
@@ -788,7 +722,7 @@
if(!holder) return
using_new_click_proc = !using_new_click_proc
world << "Testing of new click proc [using_new_click_proc ? "enabled" : "disabled"]"
// feedback_add_details("admin_verb","TNCP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","TNCP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/toggle_hear_deadcast()
set name = "Toggle Hear Deadcast"
@@ -797,7 +731,7 @@
if(!holder) return
STFU_ghosts = !STFU_ghosts
usr << "You will now [STFU_ghosts ? "not hear" : "hear"] ghosts"
// feedback_add_details("admin_verb","THDC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","THDC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/toggle_hear_radio()
set name = "Toggle Hear Radio"
@@ -806,7 +740,7 @@
if(!holder) return
STFU_radio = !STFU_radio
usr << "You will now [STFU_radio ? "not hear" : "hear"] radio chatter from nearby radios or speakers"
// feedback_add_details("admin_verb","THR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","THR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/deadmin_self()
set name = "De-admin self"
@@ -820,8 +754,9 @@
src.clear_admin_verbs()
src.update_admins(null)
admins.Remove(src.ckey)
admin_list -= src
usr << "You are now a normal player."
// feedback_add_details("admin_verb","DAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","DAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/hide_most_verbs()//Allows you to keep some functionality while hiding some verbs
@@ -850,19 +785,17 @@
verbs += /client/proc/admin_play
verbs += /client/proc/admin_observe
verbs += /client/proc/game_panel
// verbs += /client/proc/player_panel
verbs += /client/proc/player_panel
verbs += /client/proc/cmd_admin_subtle_message
verbs += /client/proc/cmd_admin_pm_context
verbs += /client/proc/cmd_admin_pm_panel
verbs += /client/proc/cmd_admin_gib_self
verbs += /client/proc/admin_invis
verbs += /client/proc/deadchat //toggles deadchat
verbs += /obj/admins/proc/toggleooc //toggle ooc
verbs += /client/proc/cmd_admin_say//asay
verbs += /client/proc/cmd_mod_say
verbs += /client/proc/toggleadminhelpsound
// feedback_add_details("admin_verb","HMV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","HMV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
@@ -878,12 +811,10 @@
verbs -= /client/proc/hide_most_verbs
verbs += /client/proc/show_verbs
if(holder.level > 0)
verbs += /client/proc/deadchat //toggles deadchat
verbs += /obj/admins/proc/toggleooc //toggle ooc
verbs += /client/proc/deadchat //toggles deadchat
verbs += /obj/admins/proc/toggleooc //toggle ooc
verbs += /client/proc/cmd_admin_say//asay
verbs += /client/proc/cmd_mod_say//asay
// feedback_add_details("admin_verb","TAVVH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","TAVVH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
/client/proc/toggle_log_hrefs()
@@ -898,155 +829,9 @@
config.log_hrefs = 1
src << "<b>Started logging hrefs</b>"
/client/proc/admin_invis()
/client/proc/check_ai_laws()
set name = "Check AI Laws"
set category = "Admin"
set name = "Invisibility"
if(!src.holder)
src << "Only administrators may use this command."
return
src.admin_invis =! src.admin_invis
if(src.mob)
mob.update_clothing()
log_admin("[key_name(usr)] has turned their invisibility [src.admin_invis ? "ON" : "OFF"]")
message_admins("[key_name_admin(usr)] has turned their invisibility [src.admin_invis ? "ON" : "OFF"]", 1)
if(holder)
src.holder.output_ai_laws()
/client/proc/cmd_admin_godmode(mob/M as mob in world)
set category = "Admin"
set name = "Toggle Godmode"
if(!src.holder)
src << "Only administrators may use this command."
return
if (M.nodamage == 1)
M.nodamage = 0
usr << "\blue Toggled OFF"
else
M.nodamage = 1
usr << "\blue Toggled ON"
log_admin("[key_name(usr)] has toggled [key_name(M)]'s nodamage to [(M.nodamage ? "On" : "Off")]")
message_admins("[key_name_admin(usr)] has toggled [key_name_admin(M)]'s nodamage to [(M.nodamage ? "On" : "Off")]", 1)
/client/proc/editappear(mob/living/carbon/human/M as mob in world)
set name = "Edit Appearance"
set category = "Fun"
if(!istype(M, /mob/living/carbon/human))
usr << "\red You can only do this to humans!"
return
switch(alert("You sure you wish to edit this mob's appearance?",,"Yes","No"))
if("No")
return
if(istype(M,/mob/living/carbon/human/tajaran))
usr << "\red Humanoid aliens do not have an editable appearance... yet!"
else
var/new_facial = input("Please select facial hair color.", "Character Generation") as color
if(new_facial)
M.r_facial = hex2num(copytext(new_facial, 2, 4))
M.g_facial = hex2num(copytext(new_facial, 4, 6))
M.b_facial = hex2num(copytext(new_facial, 6, 8))
var/new_hair = input("Please select hair color.", "Character Generation") as color
if(new_facial)
M.r_hair = hex2num(copytext(new_hair, 2, 4))
M.g_hair = hex2num(copytext(new_hair, 4, 6))
M.b_hair = hex2num(copytext(new_hair, 6, 8))
var/new_eyes = input("Please select eye color.", "Character Generation") as color
if(new_eyes)
M.r_eyes = hex2num(copytext(new_eyes, 2, 4))
M.g_eyes = hex2num(copytext(new_eyes, 4, 6))
M.b_eyes = hex2num(copytext(new_eyes, 6, 8))
var/new_tone = input("Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation") as text
if (new_tone)
M.s_tone = max(min(round(text2num(new_tone)), 220), 1)
M.s_tone = -M.s_tone + 35
// hair
var/list/all_hairs = typesof(/datum/sprite_accessory/hair) - /datum/sprite_accessory/hair
var/list/hairs = list()
// loop through potential hairs
for(var/x in all_hairs)
var/datum/sprite_accessory/hair/H = new x // create new hair datum based on type x
hairs.Add(H.name) // add hair name to hairs
del(H) // delete the hair after it's all done
var/new_style = input("Please select hair style", "Character Generation") as null|anything in hairs
// if new style selected (not cancel)
if (new_style)
M.h_style = new_style
for(var/x in all_hairs) // loop through all_hairs again. Might be slightly CPU expensive, but not significantly.
var/datum/sprite_accessory/hair/H = new x // create new hair datum
if(H.name == new_style)
M.hair_style = H // assign the hair_style variable a new hair datum
break
else
del(H) // if hair H not used, delete. BYOND can garbage collect, but better safe than sorry
// facial hair
var/list/all_fhairs = typesof(/datum/sprite_accessory/facial_hair) - /datum/sprite_accessory/facial_hair
var/list/fhairs = list()
for(var/x in all_fhairs)
var/datum/sprite_accessory/facial_hair/H = new x
fhairs.Add(H.name)
del(H)
new_style = input("Please select facial style", "Character Generation") as null|anything in fhairs
if(new_style)
M.f_style = new_style
for(var/x in all_fhairs)
var/datum/sprite_accessory/facial_hair/H = new x
if(H.name == new_style)
M.facial_hair_style = H
break
else
del(H)
var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female")
if (new_gender)
if(new_gender == "Male")
M.gender = MALE
else
M.gender = FEMALE
M.rebuild_appearance()
M.update_body()
M.check_dna(M)
/client/proc/radioalert()
set category = "Fun"
set name = "Create Radio Alert"
var/message = input("Choose a message! (Don't forget the \"says, \" or similar at the start.)", "Message") as text|null
var/from = input("From whom? (Who's saying this?)", "From") as text|null
if(message && from)
var/obj/item/device/radio/intercom/a = new /obj/item/device/radio/intercom(null)
a.autosay(message,from)
del(a)
/client/proc/CarbonCopy(atom/movable/O as mob|obj in world)
set category = "Admin"
var/atom/movable/NewObj = new O.type(usr.loc)
for(var/V in O.vars)
if (issaved(O.vars[V]))
if(V == "contents")
for(var/atom/movable/C in O.contents)
C.CarbonCopy2(NewObj)
else
NewObj.vars[V] = O.vars[V]
return NewObj
/atom/proc/CarbonCopy2(atom/movable/O as mob|obj in world)
var/atom/movable/NewObj = new type(O)
for(var/V in vars)
if (issaved(vars[V]))
if(V == "contents")
for(var/atom/movable/C in contents)
C.CarbonCopy2(NewObj)
else
NewObj.vars[V] = vars[V]
return NewObj
+1 -1
View File
@@ -1,4 +1,4 @@
//This file was auto-corrected by findeclaration.exe on 29/05/2012 15:03:05
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
var/jobban_runonce // Updates legacy bans with new info
var/jobban_keylist[0] //to store the keys & ranks
+1 -2
View File
@@ -3,8 +3,7 @@
if (!create_mob_html)
var/mobjs = null
mobjs = dd_list2text(typesof(/mob), ";")
create_mob_html = file2text('create_object.html')
create_mob_html = dd_replacetext(create_mob_html, "<title>Create Object</title>", "<title>Create Mob</title>")
create_mob_html = file2text('html/create_object.html')
create_mob_html = dd_replacetext(create_mob_html, "null /* object types */", "\"[mobjs]\"")
user << browse(dd_replacetext(create_mob_html, "/* ref src */", "\ref[src]"), "window=create_mob;size=425x475")
+2 -2
View File
@@ -4,7 +4,7 @@
if (!create_object_html)
var/objectjs = null
objectjs = dd_list2text(typesof(/obj), ";")
create_object_html = file2text('create_object.html')
create_object_html = file2text('html/create_object.html')
create_object_html = dd_replacetext(create_object_html, "null /* object types */", "\"[objectjs]\"")
user << browse(dd_replacetext(create_object_html, "/* ref src */", "\ref[src]"), "window=create_object;size=425x475")
@@ -22,7 +22,7 @@
if (!quick_create_object_html)
var/objectjs = null
objectjs = dd_list2text(typesof(path), ";")
quick_create_object_html = file2text('create_object.html')
quick_create_object_html = file2text('html/create_object.html')
quick_create_object_html = dd_replacetext(quick_create_object_html, "null /* object types */", "\"[objectjs]\"")
user << browse(dd_replacetext(quick_create_object_html, "/* ref src */", "\ref[src]"), "window=quick_create_object;size=425x475")
+1 -2
View File
@@ -3,8 +3,7 @@
if (!create_turf_html)
var/turfjs = null
turfjs = dd_list2text(typesof(/turf), ";")
create_turf_html = file2text('create_object.html')
create_turf_html = dd_replacetext(create_turf_html, "<title>Create Object</title>", "<title>Create Turf</title>")
create_turf_html = file2text('html/create_object.html')
create_turf_html = dd_replacetext(create_turf_html, "null /* object types */", "\"[turfjs]\"")
user << browse(dd_replacetext(create_turf_html, "/* ref src */", "\ref[src]"), "window=create_turf;size=425x475")
+1
View File
@@ -177,6 +177,7 @@ var/savefile/Banlistjob
message_admins("[key_name_admin(usr)] unjobbanned:[key] from [rank]")
ban_unban_log_save("[key_name_admin(usr)] unjobbanned [key] from [rank]")
feedback_inc("ban_job_unban",1)
feedback_add_details("ban_job_unban","- [rank]")
for (var/A in Banlistjob.dir)
Banlistjob.cd = "/base/[A]"
+83
View File
@@ -0,0 +1,83 @@
//This stuff was originally intended to be integrated into the ban-system I was working on
//but it's safe to say that'll never be finished. So I've merged it into the current player panel.
//enjoy ~Carn
#define NOTESFILE "data/player_notes.sav" //where the player notes are saved
obj/admins/proc/notes_show(var/ckey)
usr << browse("<head><title>Player Notes</title></head><body>[notes_gethtml(ckey)]</body>","window=player_notes;size=700x400")
obj/admins/proc/notes_gethtml(var/ckey)
var/savefile/notesfile = new(NOTESFILE)
if(!notesfile) return "<font color='red'>Error: Cannot access [NOTESFILE]</font>"
if(ckey)
. = "<b>Notes for <a href='?src=\ref[src];notes=show'>[ckey]</a>:</b> <a href='?src=\ref[src];notes=add;ckey=[ckey]'>\[+\]</a> <a href='?src=\ref[src];notes=remove;ckey=[ckey]'>\[-\]</a><br>"
notesfile.cd = "/[ckey]"
var/index = 1
while( !notesfile.eof )
var/note
notesfile >> note
. += "[note] <a href='?src=\ref[src];notes=remove;ckey=[ckey];from=[index]'>\[-\]</a><br>"
index++
else
. = "<b>All Notes:</b> <a href='?src=\ref[src];notes=add'>\[+\]</a> <a href='?src=\ref[src];notes=remove'>\[-\]</a><br>"
notesfile.cd = "/"
for(var/dir in notesfile.dir)
. += "<a href='?src=\ref[src];notes=show;ckey=[dir]'>[dir]</a><br>"
return
//handles adding notes to the end of a ckey's buffer
//originally had seperate entries such as var/by to record who left the note and when
//but the current bansystem is a heap of dung.
/proc/notes_add(var/ckey, var/note)
if(!ckey)
ckey = ckey(input(usr,"Who would you like to add notes for?","Enter a ckey",null) as text|null)
if(!ckey) return
if(!note)
note = html_encode(input(usr,"Enter your note:","Enter some text",null) as message|null)
if(!note) return
var/savefile/notesfile = new(NOTESFILE)
if(!notesfile) return
notesfile.cd = "/[ckey]"
notesfile.eof = 1 //move to the end of the buffer
notesfile << "[time2text(world.realtime,"DD-MMM-YYYY")] | [note][(usr && usr.ckey)?" ~[usr.ckey]":""]"
return
//handles removing entries from the buffer, or removing the entire directory if no start_index is given
/proc/notes_remove(var/ckey, var/start_index, var/end_index)
var/savefile/notesfile = new(NOTESFILE)
if(!notesfile) return
if(!ckey)
notesfile.cd = "/"
ckey = ckey(input(usr,"Who would you like to remove notes for?","Enter a ckey",null) as null|anything in notesfile.dir)
if(!ckey) return
if(start_index)
notesfile.cd = "/[ckey]"
var/list/noteslist = list()
if(!end_index) end_index = start_index
var/index = 0
while( !notesfile.eof )
index++
var/temp
notesfile >> temp
if( (start_index <= index) && (index <= end_index) )
continue
noteslist += temp
notesfile.eof = -2 //Move to the start of the buffer and then erase.
for( var/note in noteslist )
notesfile << note
else
notesfile.cd = "/"
if(alert(usr,"Are you sure you want to remove all their notes?","Confirmation","No","Yes - Remove all notes") == "Yes - Remove all notes")
notesfile.dir.Remove(ckey)
return
#undef NOTESFILE
+294 -221
View File
@@ -1,224 +1,321 @@
/obj/admins/proc/player_panel_new()//The new one
if (!usr.client.holder)
return
var/dat = "<html><head><title>Player Menu</title></head>"
dat += "<body><table border=1 cellspacing=5><B><tr><th>Name/Real Name</th><th>Type</th><th>Assigned Job</th><th>Info</th><th>Options</th><th>Traitor?</th></tr></B>"
//add <th>IP:</th> to this if wanting to add back in IP checking
//add <td>(IP: [M.lastKnownIP])</td> if you want to know their ip to the lists below
var/list/mobs = get_sorted_mobs()
var/i = 1
var/dat = "<html><head><title>Player Panel</title></head>"
//javascript, the part that does most of the work~
dat += {"
<head>
<script type='text/javascript'>
var locked_tabs = new Array();
function updateSearch(){
var filter_text = document.getElementById('filter');
var filter = filter_text.value.toLowerCase();
if(complete_list != null && complete_list != ""){
var mtbl = document.getElementById("maintable_data_archive");
mtbl.innerHTML = complete_list;
}
if(filter.value == ""){
return;
}else{
var maintable_data = document.getElementById('maintable_data');
var ltr = maintable_data.getElementsByTagName("tr");
for ( var i = 0; i < ltr.length; ++i )
{
try{
var tr = ltr\[i\];
if(tr.getAttribute("id").indexOf("data") != 0){
continue;
}
var ltd = tr.getElementsByTagName("td");
var td = ltd\[0\];
var lsearch = td.getElementsByTagName("b");
var search = lsearch\[0\];
//var inner_span = li.getElementsByTagName("span")\[1\] //Should only ever contain one element.
//document.write("<p>"+search.innerText+"<br>"+filter+"<br>"+search.innerText.indexOf(filter))
if ( search.innerText.toLowerCase().indexOf(filter) == -1 )
{
//document.write("a");
//ltr.removeChild(tr);
td.innerHTML = "";
i--;
}
}catch(err) { }
}
}
var count = 0;
var index = -1;
var debug = document.getElementById("debug");
locked_tabs = new Array();
}
function expand(id,job,name,real_name,image,key,ip,antagonist,ref){
clearAll();
var span = document.getElementById(id);
body = "<table><tr><td>";
body += "</td><td align='center'>";
body += "<font size='2'><b>"+job+" "+name+"</b><br><b>Real name "+real_name+"</b><br><b>Played by "+key+" ("+ip+")</b></font>"
body += "</td><td align='center'>";
body += "<a href='?src=\ref[src];adminplayeropts="+ref+"'>PP</a> - "
body += "<a href='?src=\ref[src];notes=show;mob="+ref+"'>N</a> - "
body += "<a href='?src=\ref[src];adminplayervars="+ref+"'>VV</a> - "
body += "<a href='?src=\ref[src];traitor_panel_pp="+ref+"'>TP</a> - "
body += "<a href='?src=\ref[usr];priv_msg=\ref"+ref+"'>PM</a> - "
body += "<a href='?src=\ref[src];adminplayersubtlemessage="+ref+"'>SM</a> - "
body += "<a href='?src=\ref[src];adminplayerobservejump="+ref+"'>JMP</a><br>"
if(antagonist > 0)
body += "<font size='2'><a href='?src=\ref[src];secretsadmin=check_antagonist'><font color='red'><b>Antagonist</b></font></a></font>";
body += "</td></tr></table>";
span.innerHTML = body
}
function clearAll(){
var spans = document.getElementsByTagName('span');
for(var i = 0; i < spans.length; i++){
var span = spans\[i\];
var id = span.getAttribute("id");
if(!(id.indexOf("item")==0))
continue;
var pass = 1;
for(var j = 0; j < locked_tabs.length; j++){
if(locked_tabs\[j\]==id){
pass = 0;
break;
}
}
if(pass != 1)
continue;
span.innerHTML = "";
}
}
function addToLocked(id,link_id,notice_span_id){
var link = document.getElementById(link_id);
var decision = link.getAttribute("name");
if(decision == "1"){
link.setAttribute("name","2");
}else{
link.setAttribute("name","1");
removeFromLocked(id,link_id,notice_span_id);
return;
}
var pass = 1;
for(var j = 0; j < locked_tabs.length; j++){
if(locked_tabs\[j\]==id){
pass = 0;
break;
}
}
if(!pass)
return;
locked_tabs.push(id);
var notice_span = document.getElementById(notice_span_id);
notice_span.innerHTML = "<font color='red'>Locked</font> ";
//link.setAttribute("onClick","attempt('"+id+"','"+link_id+"','"+notice_span_id+"');");
//document.write("removeFromLocked('"+id+"','"+link_id+"','"+notice_span_id+"')");
//document.write("aa - "+link.getAttribute("onClick"));
}
function attempt(ab){
return ab;
}
function removeFromLocked(id,link_id,notice_span_id){
//document.write("a");
var index = 0;
var pass = 0;
for(var j = 0; j < locked_tabs.length; j++){
if(locked_tabs\[j\]==id){
pass = 1;
index = j;
break;
}
}
if(!pass)
return;
locked_tabs\[index\] = "";
var notice_span = document.getElementById(notice_span_id);
notice_span.innerHTML = "";
//var link = document.getElementById(link_id);
//link.setAttribute("onClick","addToLocked('"+id+"','"+link_id+"','"+notice_span_id+"')");
}
function selectTextField(){
var filter_text = document.getElementById('filter');
filter_text.focus();
filter_text.select();
}
</script>
</head>
"}
//body tag start + onload and onkeypress (onkeyup) javascript event calls
dat += "<body onload='selectTextField(); updateSearch();' onkeyup='updateSearch();'>"
//title + search bar
dat += {"
<table width='560' align='center' cellspacing='0' cellpadding='5' id='maintable'>
<tr id='title_tr'>
<td align='center'>
<font size='5'><b>Player panel</b></font><br>
Hover over a line to see more information - <a href='?src=\ref[src];secretsadmin=check_antagonist'>Check antagonists</a>
<p>
</td>
</tr>
<tr id='search_tr'>
<td align='center'>
<b>Search:</b> <input type='text' id='filter' value='' style='width:300px;'>
</td>
</tr>
</table>
"}
//player table header
dat += {"
<span id='maintable_data_archive'>
<table width='560' align='center' cellspacing='0' cellpadding='5' id='maintable_data'>"}
var/list/mobs = sortmobs()
var/i = 1
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 ? "<b>[M.name]/[M.real_name]</b>" : "<b>[M.original_name] (as [M.name]/[M.real_name])</b>")
var/turf/T = get_turf(M)
var/client_key = (M.key? M.key : "No key")
dat += "<tr align='center' bgcolor='[color]'><td>[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>"
else if(isalien(M))
dat += "<td>Alien</td>"
else if(islarva(M))
dat += "<td>Alien larva</td>"
else if(istajaran(M))
dat += "<td>Tajaran</td>"
else if(ishuman(M))
dat += "<td>[M.job]</td>"
else if(ismetroid(M))
dat += "<td>Metroid</td>"
else if(ismonkey(M))
dat += "<td>Monkey</td>"
else if(isAI(M))
dat += "<td>AI</td>"
else if(ispAI(M))
dat += "<td>pAI</td>"
else if(isrobot(M))
dat += "<td>Cyborg</td>"
else if(isanimal(M))
dat += "<td>Animal</td>"
else if(iscorgi(M))
dat += "<td>Corgi</td>"
else if(istype(M,/mob/new_player))
dat += "<td>New Player</td>"
else
dat += "<td>\red ERROR</td>\black"
var/is_antagonist = is_special_character(M)
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
var/M_job = ""
if (H.wear_id)
var/obj/item/weapon/card/id/id
if(isliving(M))
if(istype(H.wear_id, /obj/item/device/pda))
var/obj/item/device/pda/PDA = H.wear_id
if(!isnull(PDA.id)) // The PDA may contain no ID
id = PDA.id // The ID is contained inside the PDA
else
id = H.wear_id // The ID was on the ID slot
if(!id) // Happens when there's no ID in the PDA located on the wear_id slot
dat += "<td>[M.mind.assigned_role] (No ID)</td>"
else if(isnull(id.assignment)) // Preventing runtime errors blocking the player panel
if(istype(id, /obj/item/weapon/card/id/syndicate))
dat += "<td><font color=purple>Antagonist</font></td>"
if(iscarbon(M)) //Carbon stuff
if(ishuman(M))
M_job = M.job
else if(ismetroid(M))
M_job = "Metroid"
else if(ismonkey(M))
M_job = "Moneky"
else if(isalien(M)) //aliens
if(islarva(M))
M_job = "Alien larva"
else
usr << "<font color=red>ERROR:</font> Inform the coders that an [id.name] was checked for its assignment variable, and it was null."
dat += "<td><font color=red>ERROR</font></td>"
M_job = "Alien"
else
if(M.mind.assigned_role == id.assignment) // Polymorph
dat += "<td>[M.mind.assigned_role]</td>"
M_job = "Carbon-based"
else
dat += "<td>[M.mind.assigned_role] ([id.assignment])"
else if(issilicon(M)) //silicon
if(isAI(M))
M_job = "AI"
else if(ispAI(M))
M_job = "pAI"
else if(isrobot(M))
M_job = "Cyborg"
else
M_job = "Silicon-based"
else if(isanimal(M)) //simple animals
if(iscorgi(M))
M_job = "Corgi"
else
M_job = "Animal"
else
dat += "<td>[M.mind.assigned_role] (No ID)</td>"
M_job = "Living"
else
dat += "<td>No Assigned Role</td>"
else if(istype(M,/mob/new_player))
M_job = "New player"
var/muting = "Mute unavailable - no client"
if(M.client)
muting = {"<A href='?src=\ref[src];mute2=\ref[M]'>Mute: [(M.client.muted ? "Muted" : "Voiced")]</A> |
<A href='?src=\ref[src];mute_complete=\ref[M]'>Complete mute: [(M.client.muted ? "Completely Muted" : "Voiced")]</A>
"}
else if(isobserver(M))
M_job = "Ghost"
M_job = dd_replacetext(M_job, "'", "")
M_job = dd_replacetext(M_job, "\"", "")
M_job = dd_replacetext(M_job, "\\", "")
var/M_name = M.name
M_name = dd_replacetext(M_name, "'", "")
M_name = dd_replacetext(M_name, "\"", "")
M_name = dd_replacetext(M_name, "\\", "")
var/M_rname = M.real_name
M_rname = dd_replacetext(M_rname, "'", "")
M_rname = dd_replacetext(M_rname, "\"", "")
M_rname = dd_replacetext(M_rname, "\\", "")
var/M_key = M.key
M_key = dd_replacetext(M_key, "'", "")
M_key = dd_replacetext(M_key, "\"", "")
M_key = dd_replacetext(M_key, "\\", "")
//output for each mob
dat += {"
<tr id='data[i]' name='[i]' onClick="addToLocked('item[i]','data[i]','notice_span[i]')">
<td align='center' bgcolor='[color]'>
<span id='notice_span[i]'></span>
<a id='link[i]'
onmouseover='expand("item[i]","[M_job]","[M_name]","[M_rname]","--unused--","[M_key]","[M.lastKnownIP]",[is_antagonist],"\ref[M]")'
>
<b id='search[i]'>[M_name] - [M_rname] - [M_key] ([M_job])</b>
</a>
<br><span id='item[i]'></span>
</td>
</tr>
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[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];traitor_panel_pp=\ref[M]'>TP</A> |
<A HREF='?src=\ref[src];adminplayersubtlemessage=\ref[M]'>SM</A> |
<A HREF='?src=\ref[src];adminplayerobservejump=\ref[M]'>JMP</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))
if(0)
dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'>Traitor?</A></td>"}
if(1)
dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'><font color=red>Traitor?</font></A></td>"}
if(2)
dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'><font color=red><b>Traitor?</b></font></A></td>"}
dat += "</table></body></html>"
usr << browse(dat, "window=players;size=905x600")
/obj/admins/proc/mod_panel()//The new one
if (!usr.client.holder)
return
var/dat = "<html><head><title>Player Menu</title></head>"
dat += "<body><table border=1 cellspacing=5><B><tr><th>Name/Real Name</th><th>IP/CID</th><th>Info</th><th>Options</th><th>Traitor?</th></tr></B>"
//add <th>IP:</th> to this if wanting to add back in IP checking <th>Type</th> <th>Assigned Job</th> <th>Traitor?</th>
//add <td>(IP: [M.lastKnownIP])</td> if you want to know their ip to the lists below
var/list/mobs = get_sorted_mobs()
var/i = 1
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 ? "<b>[M.name]/[M.real_name]</b>" : "<b>[M.original_name] (as [M.name]/[M.real_name])</b>")
var/turf/T = get_turf(M)
var/client_key = (M.key? M.key : "No key")
dat += "<tr align='center' bgcolor='[color]'><td>[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>"
else if(isalien(M))
dat += "<td>Alien</td>"
else if(islarva(M))
dat += "<td>Alien larva</td>"
else if(istajaran(M))
dat += "<td>Tajaran</td>"
else if(ishuman(M))
dat += "<td>[M.job]</td>"
else if(ismetroid(M))
dat += "<td>Metroid</td>"
else if(ismonkey(M))
dat += "<td>Monkey</td>"
else if(isAI(M))
dat += "<td>AI</td>"
else if(ispAI(M))
dat += "<td>pAI</td>"
else if(isrobot(M))
dat += "<td>Cyborg</td>"
else if(isanimal(M))
dat += "<td>Animal</td>"
else if(iscorgi(M))
dat += "<td>Corgi</td>"
else if(istype(M,/mob/new_player))
dat += "<td>New Player</td>"
else
dat += "<td>\red ERROR</td>\black"
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
if (H.wear_id)
var/obj/item/weapon/card/id/id
//player table ending
dat += {"
</table>
</span>
if(istype(H.wear_id, /obj/item/device/pda))
var/obj/item/device/pda/PDA = H.wear_id
if(!isnull(PDA.id)) // The PDA may contain no ID
id = PDA.id // The ID is contained inside the PDA
<script type='text/javascript'>
var maintable = document.getElementById("maintable_data_archive");
var complete_list = maintable.innerHTML;
</script>
</body></html>
"}
else
id = H.wear_id // The ID was on the ID slot
if(!id) // Happens when there's no ID in the PDA located on the wear_id slot
dat += "<td>[M.mind.assigned_role] (No ID)</td>"
else if(isnull(id.assignment)) // Preventing runtime errors blocking the player panel
if(istype(id, /obj/item/weapon/card/id/syndicate))
dat += "<td><font color=purple>Antagonist</font></td>"
else
usr << "<font color=red>ERROR:</font> Inform the coders that an [id.name] was checked for its assignment variable, and it was null."
dat += "<td><font color=red>ERROR</font></td>"
else
if(M.mind.assigned_role == id.assignment) // Polymorph
dat += "<td>[M.mind.assigned_role]</td>"
else
dat += "<td>[M.mind.assigned_role] ([id.assignment])"
else
dat += "<td>[M.mind.assigned_role] (No ID)</td>"
else
dat += "<td>No Assigned Role</td>"
*/
dat += {"<td>IP: [M.client ? M.client.address : "Disconnected"]<br>
CID: [M.client ? M.client.computer_id : "Disconnected"]</td>
"}
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[usr];priv_msg=\ref[M]'><b>PM</b></A></td>
"}
switch(is_special_character(M))
if(0)
dat += {"<td align=center>Loyal</td>"}
if(1)
dat += {"<td align=center><font color=red>Antag</font></td>"}
if(2)
dat += {"<td align=center><font color=red><b>Mode-Antag</b></font></td>"}
dat += "</table></body></html>"
usr << browse(dat, "window=players;size=600x600")
usr << browse(dat, "window=players;size=600x480")
//The old one
/obj/admins/proc/player_panel_old()
@@ -228,7 +325,7 @@
dat += "<body><table border=1 cellspacing=5><B><tr><th>Name</th><th>Real Name</th><th>Assigned Job</th><th>Key</th><th>Options</th><th>PM</th><th>Traitor?</th></tr></B>"
//add <th>IP:</th> to this if wanting to add back in IP checking
//add <td>(IP: [M.lastKnownIP])</td> if you want to know their ip to the lists below
var/list/mobs = get_sorted_mobs()
var/list/mobs = sortmobs()
for(var/mob/M in mobs)
if(!M.ckey) continue
@@ -296,7 +393,7 @@
dat += "<a href='?src=\ref[src];call_shuttle=2'>Send Back</a><br>"
if(1)
dat += "ETA: <a href='?src=\ref[src];edit_shuttle_time=1'>[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]</a><BR>"
dat += "<a href='?src=\ref[src];delay_round_end=1'>[ticker.delay_end ? "End Round Normally" : "Delay Round End"]</a><br>"
if(ticker.mode.syndicates.len)
dat += "<br><table cellspacing=5><tr><td><B>Syndicates</B></td><td></td></tr>"
for(var/datum/mind/N in ticker.mode.syndicates)
@@ -341,7 +438,7 @@
if(M)
dat += "<tr><td><a href='?src=\ref[src];adminplayeropts=\ref[M]'>[M.real_name]</a>[M.client ? "" : " <i>(logged out)</i>"][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>"
dat += "<td><A href='?src=\ref[usr];priv_msg=\ref[M]'>PM</A></td>"
var/turf/mob_loc = get_turf(M)
var/turf/mob_loc = get_turf_loc(M)
dat += "<td>[mob_loc.loc]</td></tr>"
else
dat += "<tr><td><i>Head not found!</i></td></tr>"
@@ -359,30 +456,6 @@
dat += "<tr><td><i>Changeling not found!</i></td></tr>"
dat += "</table>"
if(ticker.mode.memes.len > 0)
dat += "<br><table cellspacing=5><tr><td><B>Memes</B></td><td></td><td></td></tr>"
for(var/datum/mind/meme in ticker.mode.memes)
// BUG: For some reason, the memes themselves aren't showing up, even though the list isn't empty
// and the "Meme" header is displayed
var/mob/living/parasite/meme/M = meme.current
if(M)
dat += "<tr><td><a href='?src=\ref[src];adminplayeropts=\ref[M]'>[M.key]</a>[M.client ? "" : " <i>(logged out)</i>"][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>"
dat += "<td><A href='?src=\ref[usr];priv_msg=\ref[M]'>PM</A></td>"
dat += "<td><A HREF='?src=\ref[src];traitor=\ref[M]'>Show Objective</A></td></tr>"
// need this check because the meme may be possessing someone right now
if(istype(M))
dat += "\t<td>Attuned: "
for(var/mob/attuned in M.indoctrinated)
if(attuned.key)
dat += "[attuned.real_name]([attuned.key]) "
else
dat += "[attuned.real_name] "
else
dat += "<tr><td><i>Changeling not found!</i></td></tr>"
dat += "</table>"
if(ticker.mode.wizards.len > 0)
dat += "<br><table cellspacing=5><tr><td><B>Wizards</B></td><td></td><td></td></tr>"
for(var/datum/mind/wizard in ticker.mode.wizards)
+2 -2
View File
@@ -1,7 +1,7 @@
/proc/getbrokeninhands()
var/icon/IL = new('items_lefthand.dmi')
var/icon/IL = new('icons/mob/items_lefthand.dmi')
var/list/Lstates = IL.IconStates()
var/icon/IR = new('items_righthand.dmi')
var/icon/IR = new('icons/mob/items_righthand.dmi')
var/list/Rstates = IR.IconStates()
+3 -7
View File
@@ -10,16 +10,12 @@
master_controller.process()
if("No")
return 0
//feedback_add_details("admin_verb","RMC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","RMC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
/client/proc/debug_master_controller()
set category = "Debug"
set name = "Debug Master Controller"
switch(alert("Debug Master Controller or Failsafe?" ,, "Master Controller" , "Failsafe"))
if("Master Controller")
debug_variables(master_controller)
if("Failsafe")
debug_variables(Failsafe)
//feedback_add_details("admin_verb","DMC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
debug_variables(master_controller)
feedback_add_details("admin_verb","DMC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
+57 -32
View File
@@ -6,11 +6,18 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an", "monkey", "ali
/client/verb/adminhelp(msg as text)
set category = "Admin"
set name = "Adminhelp"
/*
if (muted_complete)
src << "<font color='red'>Error: Admin-PM: You are completely muted.</font>"
if (muted_adminhelp)
src << "<font color='red'>Error: Admin-PM: You cannot send adminhelps (Muted by admins).</font>"
return
*/
if (src.handle_spam_prevention(msg,MUTE_ADMINHELP))
return
src.verbs -= /client/verb/adminhelp
spawn(1200)
src.verbs += /client/verb/adminhelp // 2 minute cool-down for adminhelps
if(!msg) return
msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN))
if (!msg) return
@@ -18,15 +25,15 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an", "monkey", "ali
var/original_msg = msg
//The symbol × (fancy multiplication sign) will be used to mark where to put replacements, so the original message must not contain it.
msg = dd_replaceText(msg, "×", "")
msg = dd_replaceText(msg, "HOLDERREF", "HOLDER-REF") //HOLDERREF is a key word which gets replaced with the admin's holder ref later on, so it mustn't be in the original message
msg = dd_replaceText(msg, "ADMINREF", "ADMIN-REF") //ADMINREF is a key word which gets replaced with the admin's client's ref. So it mustn't be in the original message.
msg = dd_replacetext(msg, "×", "")
msg = dd_replacetext(msg, "HOLDERREF", "HOLDER-REF") //HOLDERREF is a key word which gets replaced with the admin's holder ref later on, so it mustn't be in the original message
msg = dd_replacetext(msg, "ADMINREF", "ADMIN-REF") //ADMINREF is a key word which gets replaced with the admin's client's ref. So it mustn't be in the original message.
var/list/msglist = dd_text2list(msg, " ")
var/list/mob/mobs = list()
for(var/mob/M in world)
for(var/mob/M in mob_list)
mobs += M
var/list/replacement_value = list() //When a word match is found, the word matched will get replaced with an × (fancy multiplication symbol).
@@ -34,6 +41,8 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an", "monkey", "ali
//So if this list has the value list("John","Jane") and msg is, at the end, "This is × and he griffed ×" the text to
//display will be "This is John and he griffe Jane". The strings in this list are a bit more complex than 'John' and 'Jane' tho.
var/ai_found = 0 //If an AI name or 'ai' word is found in the text, the additional (CL) = Check Laws button gets added. Not added every time so it doesn't spam.
//we will try to locate each word of the message in our lists of names and clients
//for each mob that we have found
//split the mob's info into a list. "John Arnolds" becomes list("John","Arnolds") so we can iterate through this
@@ -41,18 +50,21 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an", "monkey", "ali
for(var/i = 1; i <= msglist.len; i++)
var/word = msglist[i]
var/original_word = word
word = dd_replaceText(word, ".", "")
word = dd_replaceText(word, ",", "")
word = dd_replaceText(word, "!", "")
word = dd_replaceText(word, "?", "") //Strips some common punctuation characters so the actual word can be better compared.
word = dd_replaceText(word, ";", "")
word = dd_replaceText(word, ":", "")
word = dd_replaceText(word, "(", "")
word = dd_replaceText(word, ")", "")
word = dd_replacetext(word, ".", "")
word = dd_replacetext(word, ",", "")
word = dd_replacetext(word, "!", "")
word = dd_replacetext(word, "?", "") //Strips some common punctuation characters so the actual word can be better compared.
word = dd_replacetext(word, ";", "")
word = dd_replacetext(word, ":", "")
word = dd_replacetext(word, "(", "")
word = dd_replacetext(word, ")", "")
if(lowertext(word) in adminhelp_ignored_words)
continue
if(lowertext(word) == "ai")
ai_found = 1
continue
for(var/mob/M in mobs)
var/list/namelist = dd_text2list("[M.name] [M.real_name] [M.original_name] [M.ckey] [M.key]", " ")
var/list/namelist = dd_text2list("[M.name] [M.real_name] [(M.mind)?"[M.mind.name]":""] [M.ckey] [M.key]", " ")
var/word_is_match = 0 //Used to break from this mob for loop if a match is found
for(var/namepart in namelist)
if( lowertext(word) == lowertext(namepart) )
@@ -63,6 +75,8 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an", "monkey", "ali
word_is_match = 1
break
if(word_is_match)
if(isAI(M))
ai_found = 1
break //Breaks execution of the mob loop, since a match was already found.
var/j = 1 //index to the next element in the replacement_value list
@@ -73,35 +87,46 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an", "monkey", "ali
j++
msg = dd_list2text(msglist, " ")
var/admin_number = 0
var/admin_number_afk = 0
if(mob)
var/ref_mob = "\ref[src.mob]"
for (var/client/X)
if (X.holder)
admin_number++
if( X.inactivity > AFK_THRESHOLD ) //When I made this, the AFK_THRESHOLD was 3000ds = 300s = 5m, see setup.dm for the new one.
admin_number_afk++
if(X.sound_adminhelp)
X << 'adminhelp.ogg'
var/msg_to_send = "\blue <b><font color=red>HELP: </font>[key_name(src, X)] (<A HREF='?src=\ref[X.holder];adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?src=\ref[X.holder];adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?src=\ref[X.holder];adminplayervars=[ref_mob]'>VV</A>) (<A HREF='?src=\ref[X.holder];adminplayersubtlemessage=[ref_mob]'>SM</A>) (<A HREF='?src=\ref[X.holder];adminplayerobservejump=[ref_mob]'>JMP</A>) (<A HREF='?src=\ref[X.holder];secretsadmin=check_antagonist'>CA</A>):</b> [msg]"
msg_to_send = dd_replaceText(msg_to_send, "HOLDERREF", "\ref[X.holder]")
msg_to_send = dd_replaceText(msg_to_send, "ADMINREF", "\ref[X]")
X << 'sound/effects/adminhelp.ogg'
var/check_laws_text = ""
if(ai_found)
check_laws_text = (" (<A HREF='?src=\ref[X.holder];adminchecklaws=[ref_mob]'>CL</A>)")
var/msg_to_send = "\blue <b><font color=red>HELP: </font>[key_name(src, X)] (<A HREF='?src=\ref[X.holder];adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?src=\ref[X.holder];adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?src=\ref[X.holder];adminplayervars=[ref_mob]'>VV</A>) (<A HREF='?src=\ref[X.holder];adminplayersubtlemessage=[ref_mob]'>SM</A>) (<A HREF='?src=\ref[X.holder];adminplayerobservejump=[ref_mob]'>JMP</A>) (<A HREF='?src=\ref[X.holder];secretsadmin=check_antagonist'>CA</A>) [check_laws_text]:</b> [msg]"
msg_to_send = dd_replacetext(msg_to_send, "HOLDERREF", "\ref[X.holder]")
msg_to_send = dd_replacetext(msg_to_send, "ADMINREF", "\ref[X]")
X << msg_to_send
else
var/ref_client = "\ref[src]"
for (var/client/X)
if (X.holder)
admin_number++
if( X.inactivity > AFK_THRESHOLD ) //When I made this, the AFK_THRESHOLD was 3000ds = 300s = 5m, see setup.dm for the new one.
admin_number_afk++
if(X.sound_adminhelp)
X << 'adminhelp.ogg'
X << 'sound/effects/adminhelp.ogg'
var/msg_to_send = "\blue <b><font color=red>HELP: </font>[key_name(src, X)] (<A HREF='?src=\ref[X.holder];adminplayervars=[ref_client]'>VV</A>) (<A HREF='?src=\ref[X.holder];secretsadmin=check_antagonist'>CA</A>):</b> [msg]"
msg_to_send = dd_replaceText(msg_to_send, "HOLDERREF", "\ref[X.holder]")
msg_to_send = dd_replaceText(msg_to_send, "ADMINREF", "\ref[X]")
msg_to_send = dd_replacetext(msg_to_send, "HOLDERREF", "\ref[X.holder]")
msg_to_send = dd_replacetext(msg_to_send, "ADMINREF", "\ref[X]")
X << msg_to_send
src << "<font color='blue'>PM to-<b>Admins</b>: [original_msg]</font>"
log_admin("HELP: [key_name(src)]: [original_msg]")
var/list/replacechars = list("'" = "","\"" = "",">" = "","<" = "","(" = "",")" = "")
msg = sanitize_simple(msg, replacechars)
if(tension_master)
tension_master.new_adminhelp()
send2adminirc("#bs12admin","HELP: \"[src.key]: [original_msg]\"")
send2adminirc("#bs12mod","HELP: \"[src.key]: [original_msg]\"")
//feedback_add_details("admin_verb","AH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("HELP: [key_name(src)]: [original_msg] - heard by [admin_number] non-AFK admins.")
if((admin_number - admin_number_afk) <= 0)
if(!admin_number_afk)
send2irc(ckey, "[original_msg] - No admins online")
else
send2irc(ckey, "[original_msg] - All admins AFK ([admin_number_afk])")
feedback_add_details("admin_verb","AH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
+26 -38
View File
@@ -11,6 +11,7 @@
log_admin("[key_name(usr)] jumped to [A]")
message_admins("[key_name_admin(usr)] jumped to [A]", 1)
feedback_add_details("admin_verb","JA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else
alert("Admin jumping disabled")
@@ -24,11 +25,12 @@
log_admin("[key_name(usr)] jumped to [T.x],[T.y],[T.z] in [T.loc]")
message_admins("[key_name_admin(usr)] jumped to [T.x],[T.y],[T.z] in [T.loc]", 1)
usr.loc = T
feedback_add_details("admin_verb","JT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else
alert("Admin jumping disabled")
return
/client/proc/jumptomob(var/mob/M in world)
/client/proc/jumptomob(var/mob/M in mob_list)
set category = "Admin"
set name = "Jump to Mob"
@@ -37,21 +39,18 @@
return
if(config.allow_admin_jump)
if(!M || !istype(M))
var/mobs = getmobs()
var/selection = input("Please, select a player!", "Admin Jumping", null, null) as null|anything in mobs
if(!selection)
return
M = mobs[selection]
var/mob/A = src.mob
var/turf/T = get_turf(M)
if(T && isturf(T))
A.loc = T
log_admin("[key_name(usr)] jumped to [key_name(M)]")
message_admins("[key_name_admin(usr)] jumped to [key_name_admin(M)]", 1)
else
A << "This mob is not located in the game world."
log_admin("[key_name(usr)] jumped to [key_name(M)]")
message_admins("[key_name_admin(usr)] jumped to [key_name_admin(M)]", 1)
if(src.mob)
var/mob/A = src.mob
var/turf/T = get_turf(M)
if(T && isturf(T))
feedback_add_details("admin_verb","JM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
A.loc = T
else
A << "This mob is not located in the game world."
else
alert("Admin jumping disabled")
/client/proc/jumptocoord(tx as num, ty as num, tz as num)
set category = "Admin"
@@ -83,7 +82,7 @@
if(config.allow_admin_jump)
var/list/keys = list()
for(var/mob/M in world)
for(var/mob/M in player_list)
keys += M.client
var/selection = input("Please, select a player!", "Admin Jumping", null, null) as null|anything in keys
if(!selection)
@@ -92,35 +91,22 @@
log_admin("[key_name(usr)] jumped to [key_name(M)]")
message_admins("[key_name_admin(usr)] jumped to [key_name_admin(M)]", 1)
usr.loc = M.loc
feedback_add_details("admin_verb","JK") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else
alert("Admin jumping disabled")
/client/proc/Getmob(var/mob/M in world)
/client/proc/Getmob(var/mob/M in mob_list)
set category = "Admin"
set name = "Get Mob"
set desc = "Mob to teleport"
if(!src.holder)
src << "Only administrators may use this command."
return
if(config.allow_admin_jump)
if(!M || !istype(M))
var/mobs = getmobs()
var/selection = input("Please, select a player!", "Admin Jumping", null, null) as null|anything in mobs
if(!selection)
return
M = mobs[selection]
var/mob/A = src.mob
var/turf/T = get_turf(A)
if(T && isturf(T))
M.loc = T
log_admin("[key_name(usr)] teleported [key_name(M)]")
message_admins("[key_name_admin(usr)] teleported [key_name_admin(M)]", 1)
else
A << "You are not located in the game world."
log_admin("[key_name(usr)] teleported [key_name(M)]")
message_admins("[key_name_admin(usr)] teleported [key_name_admin(M)]", 1)
M.loc = get_turf(usr)
feedback_add_details("admin_verb","GM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else
alert("Admin jumping disabled")
@@ -135,7 +121,7 @@
if(config.allow_admin_jump)
var/list/keys = list()
for(var/mob/M in world)
for(var/mob/M in player_list)
keys += M.client
var/selection = input("Please, select a player!", "Admin Jumping", null, null) as null|anything in keys
if(!selection)
@@ -148,10 +134,11 @@
message_admins("[key_name_admin(usr)] teleported [key_name(M)]", 1)
if(M)
M.loc = get_turf(usr)
feedback_add_details("admin_verb","GK") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else
alert("Admin jumping disabled")
/client/proc/sendmob(var/mob/M in world, var/area/A in world)
/client/proc/sendmob(var/mob/M in mob_list, var/area/A in world)
set category = "Admin"
set name = "Send Mob"
if(!src.holder)
@@ -159,6 +146,7 @@
return
if(config.allow_admin_jump)
M.loc = pick(get_area_turfs(A))
feedback_add_details("admin_verb","SMOB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] teleported [key_name(M)] to [A]")
message_admins("[key_name_admin(usr)] teleported [key_name_admin(M)] to [A]", 1)
+17 -21
View File
@@ -1,5 +1,5 @@
//allows right clicking mobs to send an admin PM to their client, forwards the selected mob's client to cmd_admin_pm
/client/proc/cmd_admin_pm_context(mob/M as mob in world)
/client/proc/cmd_admin_pm_context(mob/M as mob in mob_list)
set category = null
set name = "Admin PM Mob"
if(!holder)
@@ -36,8 +36,8 @@
//takes input from cmd_admin_pm_context, cmd_admin_pm_panel or /client/Topic and sends them a PM.
//Fetching a message if needed. src is the sender and C is the target client
/client/proc/cmd_admin_pm(var/client/C, var/msg)
if(src.muted_complete)
src << "<font color='red'>Error: Admin-PM: You are completely muted.</font>"
if(src.muted_adminhelp)
src << "<font color='red'>Error: Admin-PM: You are unable to use admin PM-s (muted by admins).</font>"
return
if( !C || !istype(C,/client) )
@@ -47,13 +47,17 @@
//get message text, limit it's length.and clean/escape html
if(!msg)
msg = input(src,"Message:", "Private message") as text|null // This is to stop identification of stealthmins for now -- Erthilo
msg = input(src,"Message:", "Private message to [C.key]") as text|null
if(!msg) return
if(!C)
if(holder) src << "<font color='red'>Error: Admin-PM: Client not found.</font>"
else adminhelp(msg) //admin we are replying to has vanished, adminhelp instead
return
if (src.handle_spam_prevention(msg,MUTE_ADMINHELP))
return
//clean the message if it's not sent by a GA or GM
if( !holder || !(holder.rank in list("Game Admin", "Game Master")) )
msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN))
@@ -61,12 +65,8 @@
if(C.holder)
if(holder) //both are admins
if(holder.rank == "Moderator") //If moderator
C << "<font color='maroon'>Mod PM from-<b>[key_name(src, C, 1)]</b>: [msg]</font>"
src << "<font color='blue'>Mod PM to-<b>[key_name(C, src, 1)]</b>: [msg]</font>"
else
C << "<font color='red'>Admin PM from-<b>[key_name(src, C, 1)]</b>: [msg]</font>"
src << "<font color='blue'>Admin PM to-<b>[key_name(C, src, 1)]</b>: [msg]</font>"
C << "<font color='red'>Admin PM from-<b>[key_name(src, C, 1)]</b>: [msg]</font>"
src << "<font color='blue'>Admin PM to-<b>[key_name(C, src, 1)]</b>: [msg]</font>"
else //recipient is an admin but sender is not
C << "<font color='red'>Reply PM from-<b>[key_name(src, C, 1)]</b>: [msg]</font>"
@@ -74,21 +74,17 @@
//play the recieving admin the adminhelp sound (if they have them enabled)
if(C.sound_adminhelp)
C << 'adminhelp.ogg'
C << 'sound/effects/adminhelp.ogg'
else
if(holder) //sender is an admin but recipient is not. Do BIG RED TEXT
// C << "<font color='red' size='4'><b>-- Administrator private message --</b></font>"
if(holder.rank == "Moderator")
C << "<font color='maroon'>Mod PM from-<b>[key_name(src, C, 0)]</b>: [msg]</font>"
C << "<font color='maroon'><i>Click on the moderators's name to reply.</i></font>"
src << "<font color='blue'>Mod PM to-<b>[key_name(C, src, 1)]</b>: [msg]</font>"
else
C << "<font color='red'>Admin PM from-<b>[key_name(src, C, 0)]</b>: [msg]</font>"
C << "<font color='red'><i>Click on the administrator's name to reply.</i></font>"
src << "<font color='blue'>Admin PM to-<b>[key_name(C, src, 1)]</b>: [msg]</font>"
C << "<font color='red' size='4'><b>-- Administrator private message --</b></font>"
C << "<font color='red'>Admin PM from-<b>[key_name(src, C, 0)]</b>: [msg]</font>"
C << "<font color='red'><i>Click on the administrator's name to reply.</i></font>"
src << "<font color='blue'>Admin PM to-<b>[key_name(C, src, 1)]</b>: [msg]</font>"
//always play non-admin recipients the adminhelp sound
C << 'adminhelp.ogg'
C << 'sound/effects/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)
+11 -39
View File
@@ -7,8 +7,11 @@
src << "Only administrators may use this command."
return
if (src.muted || src.muted_complete)
src << "You are muted."
if (src.muted_adminhelp)
src << "You cannot send ASAY messages (muted by admins)."
return
if (src.handle_spam_prevention(msg,MUTE_ADMINHELP))
return
msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN)
@@ -17,42 +20,11 @@
if (!msg)
return
//feedback_add_details("admin_verb","M") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","M") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
for (var/mob/M in world)
if (M.client && M.client.holder && M.client.holder.level != 0) //Moderators cannot see it.
if (src.holder.rank == "Admin Observer")
M << "<span class='adminobserver'><span class='prefix'>ADMIN:</span> <EM>[key_name(usr, M)]:</EM> <span class='message'>[msg]</span></span>"
else
M << "<span class='admin'><span class='prefix'>ADMIN:</span> <EM>[key_name(usr, M)]</EM> (<A HREF='?src=\ref[M.client.holder];adminplayerobservejump=\ref[mob]'>JMP</A>): <span class='message'>[msg]</span></span>"
/client/proc/cmd_mod_say(msg as text)
set category = "Special Verbs"
set name = "Msay"
set hidden = 1
if (!src.holder)
src << "Only administrators may use this command."
return
if (src.muted || src.muted_complete)
src << "You are muted."
return
msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN)
log_admin("MOD: [key_name(src)] : [msg]")
if (!msg)
return
//feedback_add_details("admin_verb","M") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
for (var/mob/M in world)
if (M.client && M.client.holder)
if (src.holder.rank == "Admin Observer")
M << "<span class='adminobserver'><span class='prefix'>MOD:</span> <EM>[key_name(usr, M)]:</EM> <span class='message'>[msg]</span></span>"
else if (src.holder.rank == "Moderator")
M << "<span class='mod'><span class='prefix'>MOD:</span> <EM>[key_name(usr, M)]</EM> (<A HREF='?src=\ref[M.client.holder];adminplayerobservejump=\ref[mob]'>JMP</A>): <span class='message'>[msg]</span></span>"
else
M << "<span class='adminmod'><span class='prefix'>MOD:</span> <EM>[key_name(usr, M)]</EM> (<A HREF='?src=\ref[M.client.holder];adminplayerobservejump=\ref[mob]'>JMP</A>): <span class='message'>[msg]</span></span>"
for (var/client/C in admin_list)
if (src.holder.rank == "Admin Observer")
C << "<span class='adminobserver'><span class='prefix'>ADMIN:</span> <EM>[key_name(usr, C)]:</EM> <span class='message'>[msg]</span></span>"
else
C << "<span class='admin'><span class='prefix'>ADMIN:</span> <EM>[key_name(usr, C)]</EM> (<A HREF='?src=\ref[C.holder];adminplayerobservejump=\ref[mob]'>JMP</A>): <span class='message'>[msg]</span></span>"
+1 -1
View File
@@ -4,7 +4,7 @@
if(!src.holder)
src << "Only administrators may use this command."
return
//feedback_add_details("admin_verb","CP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","CP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
//all plumbing - yes, some things might get stated twice, doesn't matter.
for (var/obj/machinery/atmospherics/plumbing in world)
+8 -4
View File
@@ -7,7 +7,11 @@
return
if(!src.mob)
return
if(src.muted || src.muted_complete)
if(src.muted_deadchat)
src << "\red You cannot send DSAY messages (muted by admins)."
return
if (src.handle_spam_prevention(msg,MUTE_DEADCHAT))
return
msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN)
@@ -16,12 +20,12 @@
if (!msg)
return
var/rendered = "<span class='game deadsay'><span class='prefix'>DEAD:</span> <span class='name'>ADMIN([src.stealth ? pick("\[DATA EXPUNGED\]", "\[REDACTED\]", "\[O5 EYES ONLY\]") : src.key])</span> says, <span class='message'>\"[msg]\"</span></span>"
var/rendered = "<span class='game deadsay'><span class='prefix'>DEAD:</span> <span class='name'>ADMIN([src.stealth ? pick("BADMIN", "hornigranny", "TLF", "scaredforshadows", "KSI", "Silnazi", "HerpEs", "BJ69", "SpoofedEdd", "Uhangay", "Wario90900", "Regarity", "MissPhareon", "LastFish", "unMportant", "Deurpyn", "Fatbeaver") : src.key])</span> says, <span class='message'>\"[msg]\"</span></span>"
for (var/mob/M in world)
for (var/mob/M in player_list)
if (istype(M, /mob/new_player))
continue
if (M.stat == 2 || (M.client && M.client.holder && M.client.deadchat)) //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)
//feedback_add_details("admin_verb","D") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","D") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+232 -354
View File
@@ -17,7 +17,7 @@
else
alert("Coders only baby")
return
// feedback_add_details("admin_verb","DG2") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","DG2") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -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 (TG Version)"
set name = "Advanced ProcCall"
if(!holder)
src << "Only administrators may use this command."
@@ -98,21 +98,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
lst[i] = input("Enter type:","Type") in typesof(/obj,/mob,/area,/turf)
if("reference")
switch(alert("Would you like to enter a specific object, or search for it from the world?","Choose!","Specifc UID (Hexadecimal number)", "Search"))
if("Specifc UID (Hexadecimal number)")
var/UID = input("Type in UID, without the leading 0x","Type in UID") as text|null
if(!UID) return
var/temp_variable = locate("\[0x[UID]\]")
if(!temp_variable)
usr << "ERROR. Could not locate referenced object."
return
switch(alert("You have chosen [temp_variable], in [get_area(temp_variable)]. Are you sure?","You sure?","Yes","NONOCANCEL!"))
if("Yes")
lst[i] = temp_variable
if("NONOCANCEL!")
return
if("Search")
lst[i] = input("Select reference:","Reference") as null|mob|obj|turf|area in world
lst[i] = input("Select reference:","Reference",src) as mob|obj|turf|area in world
if("mob reference")
lst[i] = input("Select reference:","Reference",usr) as mob in world
@@ -148,135 +134,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
returnval = call(procname)(arglist(lst)) // Pass the lst as an argument list to the proc
usr << "<font color='blue'>[procname] returned: [returnval ? returnval : "null"]</font>"
//feedback_add_details("admin_verb","APC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/callprocgen()
set category = "Debug"
set name = "ProcCall (BS12 Version)"
if(!src.holder)
src << "Only administrators may use this command."
return
var/class = null
var/returnval = null
var/procname = input("Procpath (in full)","path", null)
var/argNum = input("Number of arguments:","Number",null) as num //input("Arguments","Arguments:", null)
var/list/argL = new/list()
var/i
for(i=0; i<argNum; i++)
class = input("Type of Argument #[i]","Variable Type", "text") in list("text","num","type","reference","icon","file","marked datum","cancel")
switch(class)
if("cancel")
return
if("text")
argL.Add( input("Enter new text:","Text",null) as text )
if("num")
argL.Add( input("Enter new number:","Num",null) as num )
if("type")
argL.Add( input("Enter type:","Type",null) in typesof(/obj,/mob,/area,/turf) )
if("reference")
switch(alert("Would you like to enter a specific object, or search for it from the world?","Choose!","Specifc UID (Hexadecimal number)", "Search"))
if("Specifc UID (Hexadecimal number)")
var/UID = input("Type in UID, without the leading 0x","Type in UID") as text|null
if(!UID) return
var/temp_variable = locate("\[0x[UID]\]")
if(!temp_variable)
usr << "ERROR. Could not locate referenced object."
return
switch(alert("You have chosen [temp_variable], in [get_area(temp_variable)]. Are you sure?","You sure?","Yes","NONOCANCEL!"))
if("Yes")
argL.Add(temp_variable)
if("NONOCANCEL!")
return
if("Search")
argL.Add(input("Select reference:","Reference") as null|mob|obj|turf|area in world)
if("icon")
argL.Add( input("Pick icon:","Icon",null) as icon )
if("file")
argL.Add( input("Pick file:","File",null) as file )
if("marked datum")
argL.Add(holder.marked_datum)
usr << "\blue Calling '[procname]'"
returnval = call(procname)(arglist(argL))
usr << "\blue Proc returned: [returnval ? returnval : "null"]"
/client/proc/callprocobj(var/target as obj|mob|area|turf in world)
set category = "Debug"
set name = "Object ProcCall (BS12 Version)"
if(!src.holder)
src << "Only administrators may use this command."
return
var/class = null
var/returnval = null
var/procname = input("Procpath (e.g. just \"update\" for lights)","path:", null) as null|text
if(!procname || procname == "") return
if(procname == "") return
var/argNum = input("Number of arguments:","Number",null) as num //input("Arguments","Arguments:", null)
var/list/argL = new/list()
var/i
for(i=0; i<argNum; i++)
class = input("Type of Argument #[i]","Variable Type", "text") in list("text","num","type","reference","icon","file","marked datum","cancel")
switch(class)
if("cancel")
return
if("text")
argL.Add( input("Enter new text:","Text",null) as text )
if("num")
argL.Add( input("Enter new number:","Num",null) as num )
if("type")
argL.Add( input("Enter type:","Type",null) in typesof(/obj,/mob,/area,/turf) )
if("reference")
switch(alert("Would you like to enter a specific object, or search for it from the world?","Choose!","Specifc UID (Hexadecimal number)", "Search"))
if("Specifc UID (Hexadecimal number)")
var/UID = input("Type in UID, without the leading 0x","Type in UID") as text|null
if(!UID) return
var/temp_variable = locate("\[0x[UID]\]")
if(!temp_variable)
usr << "ERROR. Could not locate referenced object."
return
switch(alert("You have chosen [temp_variable], in [get_area(temp_variable)]. Are you sure?","You sure?","Yes","NONOCANCEL!"))
if("Yes")
argL.Add(temp_variable)
if("NONOCANCEL!")
return
if("Search")
argL.Add(input("Select reference:","Reference") as null|mob|obj|turf|area in world)
if("icon")
argL.Add( input("Pick icon:","Icon",null) as icon )
if("file")
argL.Add( input("Pick file:","File",null) as file )
if("marked datum")
argL.Add(holder.marked_datum)
usr << "\blue Calling '[procname]' on '[target]'"
returnval = call(target,procname)(arglist(argL))
usr << "\blue Proc returned: [returnval ? returnval : "null"]"
feedback_add_details("admin_verb","APC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/Cell()
set category = "Debug"
@@ -297,9 +155,9 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
t+= "CO2: [env.carbon_dioxide]\n"
usr.show_message(t, 1)
//feedback_add_details("admin_verb","ASL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","ASL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_robotize(var/mob/M in world)
/client/proc/cmd_admin_robotize(var/mob/M in mob_list)
set category = "Fun"
set name = "Make Robot"
@@ -314,13 +172,13 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
else
alert("Invalid mob")
/client/proc/makepAI(var/turf/T in world)
/client/proc/makepAI(var/turf/T in mob_list)
set category = "Fun"
set name = "Make pAI"
set desc = "Specify a location to spawn a pAI device, then specify a key to play that pAI"
var/list/available = list()
for(var/mob/C in world)
for(var/mob/C in mob_list)
if(C.key)
available.Add(C)
var/mob/choice = input("Choose a player to play the pAI", "Spawn pAI") in available
@@ -335,13 +193,13 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
pai.name = input(choice, "Enter your pAI name:", "pAI Name", "Personal AI") as text
pai.real_name = pai.name
pai.key = choice.key
card.pai = pai
card.setPersonality(pai)
for(var/datum/paiCandidate/candidate in paiController.pai_candidates)
if(candidate.key == choice.key)
paiController.pai_candidates.Remove(candidate)
//feedback_add_details("admin_verb","MPAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","MPAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_alienize(var/mob/M in world)
/client/proc/cmd_admin_alienize(var/mob/M in mob_list)
set category = "Fun"
set name = "Make Alien"
@@ -352,13 +210,13 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
log_admin("[key_name(src)] has alienized [M.key].")
spawn(10)
M:Alienize()
//feedback_add_details("admin_verb","MKAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","MKAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] made [key_name(M)] into an alien.")
message_admins("\blue [key_name_admin(usr)] made [key_name(M)] into an alien.", 1)
else
alert("Invalid mob")
/client/proc/cmd_admin_metroidize(var/mob/M in world)
/client/proc/cmd_admin_metroidize(var/mob/M in mob_list)
set category = "Fun"
set name = "Make Metroid"
@@ -369,7 +227,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
log_admin("[key_name(src)] has metroidized [M.key].")
spawn(10)
M:Metroidize()
//feedback_add_details("admin_verb","MKMET") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","MKMET") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] made [key_name(M)] into a metroid.")
message_admins("\blue [key_name_admin(usr)] made [key_name(M)] into a metroid.", 1)
else
@@ -479,7 +337,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
del(O)
log_admin("[key_name(src)] has deleted all instances of [hsbitem].")
message_admins("[key_name_admin(src)] has deleted all instances of [hsbitem].", 0)
// feedback_add_details("admin_verb","DELA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","DELA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_debug_make_powernets()
set category = "Debug"
@@ -487,7 +345,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
makepowernets()
log_admin("[key_name(src)] has remade the powernet. makepowernets() called.")
message_admins("[key_name_admin(src)] has remade the powernets. makepowernets() called.", 0)
// feedback_add_details("admin_verb","MPWN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","MPWN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_debug_tog_aliens()
set category = "Server"
@@ -496,9 +354,9 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
aliens_allowed = !aliens_allowed
log_admin("[key_name(src)] has turned aliens [aliens_allowed ? "on" : "off"].")
message_admins("[key_name_admin(src)] has turned aliens [aliens_allowed ? "on" : "off"].", 0)
// feedback_add_details("admin_verb","TAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","TAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_grantfullaccess(var/mob/M in world)
/client/proc/cmd_admin_grantfullaccess(var/mob/M in mob_list)
set category = "Admin"
set name = "Grant Full Access"
@@ -521,15 +379,15 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
id.registered_name = H.real_name
id.assignment = "Captain"
id.name = "[id.registered_name]'s ID Card ([id.assignment])"
H.equip_if_possible(id, H.slot_wear_id)
H.update_clothing()
H.equip_to_slot_or_del(id, slot_wear_id)
H.update_inv_wear_id()
else
alert("Invalid mob")
//feedback_add_details("admin_verb","GFA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","GFA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(src)] has granted [M.key] full access.")
message_admins("\blue [key_name_admin(usr)] has granted [M.key] full access.", 1)
/client/proc/cmd_assume_direct_control(var/mob/M in world)
/client/proc/cmd_assume_direct_control(var/mob/M in mob_list)
set category = "Admin"
set name = "Assume direct control"
set desc = "Direct intervention"
@@ -538,19 +396,32 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(alert("This mob is being controlled by [M.ckey]. Are you sure you wish to assume control of it? [M.ckey] will be made a ghost.",,"Yes","No") != "Yes")
return
else
var/mob/dead/observer/ghost = new/mob/dead/observer()
ghost.ckey = M.ckey;
var/mob/dead/observer/ghost = new/mob/dead/observer(M,1)
ghost.ckey = M.ckey
var/mob/adminmob = src.mob
M.ckey = src.ckey;
M.ckey = src.ckey
if( isobserver(adminmob) )
del(adminmob)
//feedback_add_details("admin_verb","ADC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","ADC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] assumed direct control of [M].")
message_admins("\blue [key_name_admin(usr)] assumed direct control of [M].", 1)
/client/proc/cmd_admin_dress(var/mob/living/carbon/human/M in world)
/client/proc/cmd_switch_radio()
set category = "Debug"
set name = "Switch Radio Mode"
set desc = "Toggle between normal radios and experimental radios. Have a coder present if you do this."
GLOBAL_RADIO_TYPE = !GLOBAL_RADIO_TYPE // toggle
log_admin("[key_name(src)] has turned the experimental radio system [GLOBAL_RADIO_TYPE ? "on" : "off"].")
message_admins("[key_name_admin(src)] has turned the experimental radio system [GLOBAL_RADIO_TYPE ? "on" : "off"].", 0)
feedback_add_details("admin_verb","SRM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_dress(var/mob/living/carbon/human/M in mob_list)
set category = "Fun"
set name = "Select equipment"
if(!ishuman(M))
@@ -573,7 +444,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
"assassin",
"death commando",
"syndicate commando",
"response team",
"centcom official",
"centcom commander",
"special ops officer",
@@ -584,7 +454,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
var/dresscode = input("Select dress for [M]", "Robust quick dress shop") as null|anything in dresspacks
if (isnull(dresscode))
return
//feedback_add_details("admin_verb","SEQ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","SEQ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
for (var/obj/item/I in M)
if (istype(I, /obj/item/weapon/implant))
continue
@@ -593,176 +463,174 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if ("strip")
//do nothing
if ("standard space gear")
M.equip_if_possible(new /obj/item/clothing/shoes/black(M), M.slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_if_possible(new /obj/item/clothing/under/color/grey(M), M.slot_w_uniform)
M.equip_if_possible(new /obj/item/clothing/suit/space(M), M.slot_wear_suit)
M.equip_if_possible(new /obj/item/clothing/head/helmet/space(M), M.slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space(M), slot_head)
var /obj/item/weapon/tank/jetpack/J = new /obj/item/weapon/tank/jetpack/oxygen(M)
M.equip_if_possible(J, M.slot_back)
M.equip_to_slot_or_del(J, slot_back)
J.toggle()
M.equip_if_possible(new /obj/item/clothing/mask/breath(M), M.slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(M), slot_wear_mask)
J.Topic(null, list("stat" = 1))
if ("tournament standard red","tournament standard green") //we think stunning weapon is too overpowered to use it on tournaments. --rastaf0
if (dresscode=="tournament standard red")
M.equip_if_possible(new /obj/item/clothing/under/color/red(M), M.slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/red(M), slot_w_uniform)
else
M.equip_if_possible(new /obj/item/clothing/under/color/green(M), M.slot_w_uniform)
M.equip_if_possible(new /obj/item/clothing/shoes/black(M), M.slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/green(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_if_possible(new /obj/item/clothing/suit/armor/vest(M), M.slot_wear_suit)
M.equip_if_possible(new /obj/item/clothing/head/helmet/thunderdome(M), M.slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/thunderdome(M), slot_head)
M.equip_if_possible(new /obj/item/weapon/gun/energy/pulse_rifle/destroyer(M), M.slot_r_hand)
M.equip_if_possible(new /obj/item/weapon/kitchenknife(M), M.slot_l_hand)
M.equip_if_possible(new /obj/item/weapon/smokebomb(M), M.slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/destroyer(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/grenade/smokebomb(M), slot_r_store)
if ("tournament gangster") //gangster are supposed to fight each other. --rastaf0
M.equip_if_possible(new /obj/item/clothing/under/det(M), M.slot_w_uniform)
M.equip_if_possible(new /obj/item/clothing/shoes/black(M), M.slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/under/det(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_if_possible(new /obj/item/clothing/suit/storage/det_suit(M), M.slot_wear_suit)
M.equip_if_possible(new /obj/item/clothing/glasses/thermal/monocle(M), M.slot_glasses)
M.equip_if_possible(new /obj/item/clothing/head/det_hat(M), M.slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/det_suit(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/head/det_hat(M), slot_head)
M.equip_if_possible(new /obj/item/weapon/cloaking_device(M), M.slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/cloaking_device(M), slot_r_store)
M.equip_if_possible(new /obj/item/weapon/gun/projectile(M), M.slot_r_hand)
M.equip_if_possible(new /obj/item/ammo_magazine/a357(M), M.slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/ammo_magazine/a357(M), slot_l_store)
if ("tournament chef") //Steven Seagal FTW
M.equip_if_possible(new /obj/item/clothing/under/rank/chef(M), M.slot_w_uniform)
M.equip_if_possible(new /obj/item/clothing/suit/storage/chef(M), M.slot_wear_suit)
M.equip_if_possible(new /obj/item/clothing/shoes/black(M), M.slot_shoes)
M.equip_if_possible(new /obj/item/clothing/head/chefhat(M), M.slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chef(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/chef(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/head/chefhat(M), slot_head)
M.equip_if_possible(new /obj/item/weapon/kitchen/rollingpin(M), M.slot_r_hand)
M.equip_if_possible(new /obj/item/weapon/kitchenknife(M), M.slot_l_hand)
M.equip_if_possible(new /obj/item/weapon/kitchenknife(M), M.slot_r_store)
M.equip_if_possible(new /obj/item/weapon/kitchenknife(M), M.slot_s_store)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/rollingpin(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_s_store)
if ("tournament janitor")
M.equip_if_possible(new /obj/item/clothing/under/rank/janitor(M), M.slot_w_uniform)
M.equip_if_possible(new /obj/item/clothing/shoes/black(M), M.slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/janitor(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
var/obj/item/weapon/storage/backpack/backpack = new(M)
for(var/obj/item/I in backpack)
del(I)
M.equip_if_possible(backpack, M.slot_back)
M.equip_to_slot_or_del(backpack, slot_back)
M.equip_if_possible(new /obj/item/weapon/mop(M), M.slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/mop(M), slot_r_hand)
var/obj/item/weapon/reagent_containers/glass/bucket/bucket = new(M)
bucket.reagents.add_reagent("water", 70)
M.equip_if_possible(bucket, M.slot_l_hand)
M.equip_to_slot_or_del(bucket, slot_l_hand)
M.equip_if_possible(new /obj/item/weapon/chem_grenade/cleaner(M), M.slot_r_store)
M.equip_if_possible(new /obj/item/weapon/chem_grenade/cleaner(M), M.slot_l_store)
M.equip_if_possible(new /obj/item/stack/tile/plasteel(M), M.slot_in_backpack)
M.equip_if_possible(new /obj/item/stack/tile/plasteel(M), M.slot_in_backpack)
M.equip_if_possible(new /obj/item/stack/tile/plasteel(M), M.slot_in_backpack)
M.equip_if_possible(new /obj/item/stack/tile/plasteel(M), M.slot_in_backpack)
M.equip_if_possible(new /obj/item/stack/tile/plasteel(M), M.slot_in_backpack)
M.equip_if_possible(new /obj/item/stack/tile/plasteel(M), M.slot_in_backpack)
M.equip_if_possible(new /obj/item/stack/tile/plasteel(M), M.slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/grenade/chem_grenade/cleaner(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/grenade/chem_grenade/cleaner(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
if ("pirate")
M.equip_if_possible(new /obj/item/clothing/under/pirate(M), M.slot_w_uniform)
M.equip_if_possible(new /obj/item/clothing/shoes/brown(M), M.slot_shoes)
M.equip_if_possible(new /obj/item/clothing/head/bandana(M), M.slot_head)
M.equip_if_possible(new /obj/item/clothing/glasses/eyepatch(M), M.slot_glasses)
M.equip_if_possible(new /obj/item/weapon/melee/energy/sword/pirate(M), M.slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/head/bandana(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/pirate(M), slot_r_hand)
if ("space pirate")
M.equip_if_possible(new /obj/item/clothing/under/pirate(M), M.slot_w_uniform)
M.equip_if_possible(new /obj/item/clothing/shoes/brown(M), M.slot_shoes)
M.equip_if_possible(new /obj/item/clothing/suit/space/pirate(M), M.slot_wear_suit)
M.equip_if_possible(new /obj/item/clothing/head/helmet/space/pirate(M), M.slot_head)
M.equip_if_possible(new /obj/item/clothing/glasses/eyepatch(M), M.slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/pirate(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/pirate(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses)
M.equip_if_possible(new /obj/item/weapon/melee/energy/sword/pirate(M), M.slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/pirate(M), slot_r_hand)
/*
if ("soviet soldier")
M.equip_if_possible(new /obj/item/clothing/under/soviet(M), M.slot_w_uniform)
M.equip_if_possible(new /obj/item/clothing/shoes/black(M), M.slot_shoes)
M.equip_if_possible(new /obj/item/clothing/head/ushanka(M), M.slot_head)
*/
M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(M), slot_head)
if("tunnel clown")//Tunnel clowns rule!
M.equip_if_possible(new /obj/item/clothing/under/rank/clown(M), M.slot_w_uniform)
M.equip_if_possible(new /obj/item/clothing/shoes/clown_shoes(M), M.slot_shoes)
M.equip_if_possible(new /obj/item/clothing/gloves/black(M), M.slot_gloves)
M.equip_if_possible(new /obj/item/clothing/mask/gas/clown_hat(M), M.slot_wear_mask)
M.equip_if_possible(new /obj/item/clothing/head/chaplain_hood(M), M.slot_head)
M.equip_if_possible(new /obj/item/device/radio/headset(M), M.slot_ears)
M.equip_if_possible(new /obj/item/clothing/glasses/thermal/monocle(M), M.slot_glasses)
M.equip_if_possible(new /obj/item/clothing/suit/storage/chaplain_hoodie(M), M.slot_wear_suit)
M.equip_if_possible(new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(M), M.slot_l_store)
M.equip_if_possible(new /obj/item/weapon/bikehorn(M), M.slot_r_store)
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/clothing/head/chaplain_hood(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/chaplain_hoodie(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(M), slot_r_store)
var/obj/item/weapon/card/id/W = new(M)
W.name = "[M.real_name]'s ID Card"
W.access = get_all_accesses()
W.assignment = "Tunnel Clown!"
W.registered_name = M.real_name
M.equip_if_possible(W, M.slot_wear_id)
M.equip_to_slot_or_del(W, slot_wear_id)
var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M)
M.equip_if_possible(fire_axe, M.slot_r_hand)
M.equip_to_slot_or_del(fire_axe, slot_r_hand)
if("masked killer")
M.equip_if_possible(new /obj/item/clothing/under/overalls(M), M.slot_w_uniform)
M.equip_if_possible(new /obj/item/clothing/shoes/white(M), M.slot_shoes)
M.equip_if_possible(new /obj/item/clothing/gloves/latex(M), M.slot_gloves)
M.equip_if_possible(new /obj/item/clothing/mask/surgical(M), M.slot_wear_mask)
M.equip_if_possible(new /obj/item/clothing/head/helmet/welding(M), M.slot_head)
M.equip_if_possible(new /obj/item/device/radio/headset(M), M.slot_ears)
M.equip_if_possible(new /obj/item/clothing/glasses/thermal/monocle(M), M.slot_glasses)
M.equip_if_possible(new /obj/item/clothing/suit/storage/apron(M), M.slot_wear_suit)
M.equip_if_possible(new /obj/item/weapon/kitchenknife(M), M.slot_l_store)
M.equip_if_possible(new /obj/item/weapon/scalpel(M), M.slot_r_store)
M.equip_to_slot_or_del(new /obj/item/clothing/under/overalls(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/latex(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/scalpel(M), slot_r_store)
var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M)
M.equip_if_possible(fire_axe, M.slot_r_hand)
M.equip_to_slot_or_del(fire_axe, slot_r_hand)
for(var/obj/item/carried_item in M.contents)
if(!istype(carried_item, /obj/item/weapon/implant))//If it's not an implant.
carried_item.add_blood(M)//Oh yes, there will be blood...
if("assassin")
M.equip_if_possible(new /obj/item/clothing/under/suit_jacket(M), M.slot_w_uniform)
M.equip_if_possible(new /obj/item/clothing/shoes/black(M), M.slot_shoes)
M.equip_if_possible(new /obj/item/clothing/gloves/black(M), M.slot_gloves)
M.equip_if_possible(new /obj/item/device/radio/headset(M), M.slot_ears)
M.equip_if_possible(new /obj/item/clothing/glasses/sunglasses(M), M.slot_glasses)
M.equip_if_possible(new /obj/item/clothing/suit/storage/wcoat(M), M.slot_wear_suit)
M.equip_if_possible(new /obj/item/weapon/melee/energy/sword(M), M.slot_l_store)
M.equip_if_possible(new /obj/item/weapon/cloaking_device(M), M.slot_r_store)
M.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wcoat(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/cloaking_device(M), slot_r_store)
var/obj/item/weapon/secstorage/sbriefcase/sec_briefcase = new(M)
for(var/obj/item/briefcase_item in sec_briefcase)
del(briefcase_item)
for(var/i=3, i>0, i--)
sec_briefcase.contents += new /obj/item/weapon/money/c1000
sec_briefcase.contents += new /obj/item/weapon/spacecash/c1000
sec_briefcase.contents += new /obj/item/weapon/gun/energy/crossbow
sec_briefcase.contents += new /obj/item/weapon/gun/projectile/mateba
sec_briefcase.contents += new /obj/item/ammo_magazine/a357
sec_briefcase.contents += new /obj/item/weapon/plastique
M.equip_if_possible(sec_briefcase, M.slot_l_hand)
M.equip_to_slot_or_del(sec_briefcase, slot_l_hand)
var/obj/item/device/pda/heads/pda = new(M)
pda.owner = M.real_name
pda.ownjob = "Reaper"
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
M.equip_if_possible(pda, M.slot_belt)
M.equip_to_slot_or_del(pda, slot_belt)
var/obj/item/weapon/card/id/syndicate/W = new(M)
W.name = "[M.real_name]'s ID Card"
W.access = get_all_accesses()
W.assignment = "Reaper"
W.registered_name = M.real_name
M.equip_if_possible(W, M.slot_wear_id)
M.equip_to_slot_or_del(W, slot_wear_id)
if("death commando")//Was looking to add this for a while.
M.equip_death_commando()
@@ -770,53 +638,45 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if("syndicate commando")
M.equip_syndicate_commando()
if("response team")
M.equip_strike_team()
if("centcom official")
M.equip_if_possible(new /obj/item/clothing/under/rank/centcom_officer(M), M.slot_w_uniform)
M.equip_if_possible(new /obj/item/clothing/shoes/black(M), M.slot_shoes)
M.equip_if_possible(new /obj/item/clothing/gloves/white(M), M.slot_gloves)
M.equip_if_possible(new /obj/item/device/radio/headset/heads/hop(M), M.slot_ears)
var/obj/item/clothing/suit/storage/armoredundersuit/K = new(M)
var/obj/item/clothing/glasses/sunglasses/V = new(M)
V.loc = K
M.equip_if_possible(K, M.slot_wear_suit)
M.equip_if_possible(new /obj/item/weapon/gun/energy/gun(M), M.slot_s_store)
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/hop(M), slot_ears)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/weapon/pen(M), slot_l_store)
var/obj/item/device/pda/heads/pda = new(M)
pda.owner = M.real_name
pda.ownjob = "CentCom Review Official"
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
M.equip_if_possible(pda, M.slot_r_store)
M.equip_if_possible(new /obj/item/weapon/clipboard(M), M.slot_l_store)
M.equip_to_slot_or_del(pda, slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/clipboard(M), slot_l_hand)
var/obj/item/weapon/card/id/W = new(M)
W.name = "[M.real_name]'s ID Card"
W.icon_state = "centcom"
W.item_state = "id_inv"
W.access = get_all_accesses()
W.access += list("VIP Guest","Custodian","Thunderdome Overseer","Intel Officer","Medical Officer","Death Commando","Research Officer")
W.assignment = "CentCom Review Official"
W.registered_name = M.real_name
W.over_jumpsuit = 0
M.equip_if_possible(W, M.slot_wear_id)
M.equip_to_slot_or_del(W, slot_wear_id)
if("centcom commander")
M.equip_if_possible(new /obj/item/clothing/under/rank/centcom_commander(M), M.slot_w_uniform)
var/obj/item/clothing/suit/storage/armoredundersuit/K = new(M)
var/obj/item/clothing/glasses/eyepatch/G = new(M)
G.loc = K
M.equip_if_possible(K, M.slot_wear_suit)
M.equip_if_possible(new /obj/item/clothing/shoes/swat(M), M.slot_shoes)
M.equip_if_possible(new /obj/item/clothing/gloves/white(M), M.slot_gloves)
M.equip_if_possible(new /obj/item/device/radio/headset/heads/captain(M), M.slot_ears)
M.equip_if_possible(new /obj/item/clothing/mask/cigarette/cigar/cohiba(M), M.slot_wear_mask)
M.equip_if_possible(new /obj/item/clothing/head/centhat(M), M.slot_head)
M.equip_if_possible(new /obj/item/weapon/gun/projectile/mateba(M), M.slot_s_store)
M.equip_if_possible(new /obj/item/weapon/lighter/zippo(M), M.slot_r_store)
M.equip_if_possible(new /obj/item/ammo_magazine/a357(M), M.slot_l_store)
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_commander(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/bulletproof(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(M), slot_ears)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/cohiba(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/clothing/head/centhat(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/mateba(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/weapon/lighter/zippo(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/ammo_magazine/a357(M), slot_l_store)
var/obj/item/weapon/card/id/W = new(M)
W.name = "[M.real_name]'s ID Card"
@@ -825,21 +685,20 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
W.access += get_all_centcom_access()
W.assignment = "CentCom Commanding Officer"
W.registered_name = M.real_name
W.over_jumpsuit = 0
M.equip_if_possible(W, M.slot_wear_id)
M.equip_to_slot_or_del(W, slot_wear_id)
if("special ops officer")
M.equip_if_possible(new /obj/item/clothing/under/syndicate/combat(M), M.slot_w_uniform)
M.equip_if_possible(new /obj/item/clothing/suit/storage/officer(M), M.slot_wear_suit)
M.equip_if_possible(new /obj/item/clothing/shoes/combat(M), M.slot_shoes)
M.equip_if_possible(new /obj/item/clothing/gloves/combat(M), M.slot_gloves)
M.equip_if_possible(new /obj/item/device/radio/headset/heads/captain(M), M.slot_ears)
M.equip_if_possible(new /obj/item/clothing/glasses/thermal/eyepatch(M), M.slot_glasses)
M.equip_if_possible(new /obj/item/clothing/mask/cigarette/cigar/havana(M), M.slot_wear_mask)
M.equip_if_possible(new /obj/item/clothing/head/deathsquad/beret(M), M.slot_head)
M.equip_if_possible(new /obj/item/weapon/gun/energy/pulse_rifle/M1911(M), M.slot_belt)
M.equip_if_possible(new /obj/item/weapon/lighter/zippo(M), M.slot_r_store)
M.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel(M), M.slot_back)
M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate/combat(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/swat/officer(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(M), slot_ears)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/havana(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/M1911(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/weapon/lighter/zippo(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
var/obj/item/weapon/card/id/W = new(M)
W.name = "[M.real_name]'s ID Card"
@@ -848,53 +707,53 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
W.access += get_all_centcom_access()
W.assignment = "Special Operations Officer"
W.registered_name = M.real_name
M.equip_if_possible(W, M.slot_wear_id)
M.equip_to_slot_or_del(W, slot_wear_id)
if("blue wizard")
M.equip_if_possible(new /obj/item/clothing/under/lightpurple(M), M.slot_w_uniform)
M.equip_if_possible(new /obj/item/clothing/suit/wizrobe(M), M.slot_wear_suit)
M.equip_if_possible(new /obj/item/clothing/shoes/sandal(M), M.slot_shoes)
M.equip_if_possible(new /obj/item/device/radio/headset(M), M.slot_ears)
M.equip_if_possible(new /obj/item/clothing/head/wizard(M), M.slot_head)
M.equip_if_possible(new /obj/item/weapon/teleportation_scroll(M), M.slot_r_store)
M.equip_if_possible(new /obj/item/weapon/spellbook(M), M.slot_r_hand)
M.equip_if_possible(new /obj/item/weapon/staff(M), M.slot_l_hand)
M.equip_if_possible(new /obj/item/weapon/storage/backpack(M), M.slot_back)
M.equip_if_possible(new /obj/item/weapon/storage/box(M), M.slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/under/lightpurple(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/staff(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack)
if("red wizard")
M.equip_if_possible(new /obj/item/clothing/under/lightpurple(M), M.slot_w_uniform)
M.equip_if_possible(new /obj/item/clothing/suit/wizrobe/red(M), M.slot_wear_suit)
M.equip_if_possible(new /obj/item/clothing/shoes/sandal(M), M.slot_shoes)
M.equip_if_possible(new /obj/item/device/radio/headset(M), M.slot_ears)
M.equip_if_possible(new /obj/item/clothing/head/wizard/red(M), M.slot_head)
M.equip_if_possible(new /obj/item/weapon/teleportation_scroll(M), M.slot_r_store)
M.equip_if_possible(new /obj/item/weapon/spellbook(M), M.slot_r_hand)
M.equip_if_possible(new /obj/item/weapon/staff(M), M.slot_l_hand)
M.equip_if_possible(new /obj/item/weapon/storage/backpack(M), M.slot_back)
M.equip_if_possible(new /obj/item/weapon/storage/box(M), M.slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/under/lightpurple(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/red(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/red(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/staff(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack)
if("marisa wizard")
M.equip_if_possible(new /obj/item/clothing/under/lightpurple(M), M.slot_w_uniform)
M.equip_if_possible(new /obj/item/clothing/suit/wizrobe/marisa(M), M.slot_wear_suit)
M.equip_if_possible(new /obj/item/clothing/shoes/sandal/marisa(M), M.slot_shoes)
M.equip_if_possible(new /obj/item/device/radio/headset(M), M.slot_ears)
M.equip_if_possible(new /obj/item/clothing/head/wizard/marisa(M), M.slot_head)
M.equip_if_possible(new /obj/item/weapon/teleportation_scroll(M), M.slot_r_store)
M.equip_if_possible(new /obj/item/weapon/spellbook(M), M.slot_r_hand)
M.equip_if_possible(new /obj/item/weapon/staff(M), M.slot_l_hand)
M.equip_if_possible(new /obj/item/weapon/storage/backpack(M), M.slot_back)
M.equip_if_possible(new /obj/item/weapon/storage/box(M), M.slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/under/lightpurple(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/marisa(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/marisa(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/marisa(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/staff(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack)
if("soviet admiral")
M.equip_if_possible(new /obj/item/clothing/head/hgpiratecap(M), M.slot_head)
M.equip_if_possible(new /obj/item/clothing/shoes/combat(M), M.slot_shoes)
M.equip_if_possible(new /obj/item/clothing/gloves/combat(M), M.slot_gloves)
M.equip_if_possible(new /obj/item/device/radio/headset/heads/captain(M), M.slot_ears)
M.equip_if_possible(new /obj/item/clothing/glasses/thermal/eyepatch(M), M.slot_glasses)
M.equip_if_possible(new /obj/item/clothing/suit/hgpirate(M), M.slot_wear_suit)
M.equip_if_possible(new /obj/item/weapon/storage/backpack/bandolier(M), M.slot_back)
M.equip_if_possible(new /obj/item/weapon/gun/projectile/mateba(M), M.slot_belt)
M.equip_if_possible(new /obj/item/clothing/under/soviet(M), M.slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/head/hgpiratecap(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(M), slot_ears)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/hgpirate(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/bandolier(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/mateba(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
var/obj/item/weapon/card/id/W = new(M)
W.name = "[M.real_name]'s ID Card"
W.icon_state = "centcom"
@@ -902,12 +761,12 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
W.access += get_all_centcom_access()
W.assignment = "Admiral"
W.registered_name = M.real_name
M.equip_if_possible(W, M.slot_wear_id)
M.equip_to_slot_or_del(W, slot_wear_id)
M.update_clothing()
M.regenerate_icons()
log_admin("[key_name(usr)] changed the equipment of [key_name(M)] to [dresscode].")
message_admins("\blue [key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode].", 1)
message_admins("\blue [key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode]..", 1)
return
/client/proc/startSinglo()
@@ -934,7 +793,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
del(G)
S.energy = 1750
S.current_size = 7
S.icon = '224x224.dmi'
S.icon = 'icons/effects/224x224.dmi'
S.icon_state = "singularity_s7"
S.pixel_x = -96
S.pixel_y = -96
@@ -959,4 +818,23 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
for(var/obj/machinery/power/smes/SMES in world)
if(SMES.anchored)
SMES.chargemode = 1
SMES.chargemode = 1
/client/proc/cmd_debug_mob_lists()
set category = "Debug"
set name = "Debug Mob Lists"
set desc = "For when you just gotta know"
switch(input("Which list?") in list("Players","Admins","Mobs","Living Mobs","Dead Mobs", "Clients"))
if("Players")
usr << dd_list2text(player_list,",")
if("Admins")
usr << dd_list2text(admin_list,",")
if("Mobs")
usr << dd_list2text(mob_list,",")
if("Living Mobs")
usr << dd_list2text(living_mob_list,",")
if("Dead Mobs")
usr << dd_list2text(dead_mob_list,",")
if("Clients")
usr << dd_list2text(client_list,",")
+30 -72
View File
@@ -7,7 +7,7 @@
usr << alert("Master_controller not found.")
var/mobs = 0
for(var/mob/M in world)
for(var/mob/M in mob_list)
mobs++
var/output = {"<B>GENERAL SYSTEMS REPORT</B><HR>
@@ -20,12 +20,15 @@
"}
usr << browse(output,"window=generalreport")
//feedback_add_details("admin_verb","SGR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","SGR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/* air_report()
//todo:
air_report()
set category = "Debug"
set name = "Show Air Report"
usr << "\red This proc is unavailable."
/*
if(!master_controller || !air_master)
alert(usr,"Master_controller or air_master not found.","Air Report")
return 0
@@ -63,12 +66,16 @@
"}
usr << browse(output,"window=airreport")
//feedback_add_details("admin_verb","SAR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","SAR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
*/
//todo:
air_status(turf/target as turf)
set category = "Debug"
set name = "Display Air Status"
usr << "\red This proc is unavailable."
/*
if(!isturf(target))
return
@@ -82,8 +89,9 @@
usr << "\blue @[target.x],[target.y] ([GM.group_multiplier]): O:[GM.oxygen] T:[GM.toxins] N:[GM.nitrogen] C:[GM.carbon_dioxide] w [GM.temperature] Kelvin, [GM.return_pressure()] kPa [(burning)?("\red BURNING"):(null)]"
for(var/datum/gas/trace_gas in GM.trace_gases)
usr << "[trace_gas.type]: [trace_gas.moles]"
//feedback_add_details("admin_verb","DAST") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
*/
feedback_add_details("admin_verb","DAST") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
*/
fix_next_move()
set category = "Debug"
set name = "Unfreeze Everyone"
@@ -112,7 +120,7 @@
message_admins("[key_name_admin(largest_move_mob)] had the largest move delay with [largest_move_time] frames / [largest_move_time/10] seconds!", 1)
message_admins("[key_name_admin(largest_click_mob)] had the largest click delay with [largest_click_time] frames / [largest_click_time/10] seconds!", 1)
message_admins("world.time = [world.time]", 1)
//feedback_add_details("admin_verb","UFE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","UFE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
radio_report()
@@ -150,7 +158,7 @@
output += "&nbsp;&nbsp;&nbsp;&nbsp;[device]<br>"
usr << browse(output,"window=radioreport")
//feedback_add_details("admin_verb","RR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","RR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
reload_admins()
set name = "Reload Admins"
@@ -180,12 +188,15 @@
var/a_lev = copytext(line, pos + 3, length(line) + 1)
admins[m_key] = a_lev
diary << ("ADMIN: [m_key] = [a_lev]")
//feedback_add_details("admin_verb","RLDA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","RLDA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/*jump_to_dead_group()
//todo:
jump_to_dead_group()
set name = "Jump to dead group"
set category = "Debug"
usr << "\red This proc is unavailable."
/*
if(!holder)
src << "Only administrators may use this command."
return
@@ -199,13 +210,16 @@
dead_groups += group
var/datum/air_group/dest_group = pick(dead_groups)
usr.loc = pick(dest_group.members)
//feedback_add_details("admin_verb","JDAG") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","JDAG") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
*/
kill_airgroup()
set name = "Kill Local Airgroup"
set desc = "Use this to allow manual manipulation of atmospherics."
set desc = "Use this to allow manual manupliation of atmospherics."
set category = "Debug"
usr << "\red This proc is unavailable."
/*
if(!holder)
src << "Only administrators may use this command."
return
@@ -217,65 +231,9 @@
var/turf/T = get_turf(usr)
if(istype(T, /turf/simulated))
var/datum/air_group/AG = T:parent
AG.next_check = 30
AG.group_processing = 0
else
usr << "Local airgroup is unsimulated!"
//feedback_add_details("admin_verb","KLAG") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
*/
tension_report()
set category = "Debug"
set name = "Show Tension Report"
if(!master_controller || !tension_master)
alert(usr,"Master_controller or tension_master not found.","Tension Report")
return 0
if (!tension_master.get_num_players())
alert(usr,"No players found. How the fuck are you calling this?","Tension Report")
return 0
var/numghosts = 0
for(var/mob/dead/observer/theghost in world)
numghosts ++
var/output = {"<B>TENSION REPORT</B><HR>
<B>General Statistics</B><BR>
<B>Deaths:</B> [tension_master.deaths]<BR>
---- <I>Humans:</I> [tension_master.human_deaths]<BR>
<B>Explosions:</B> [tension_master.explosions]<BR>
<B>Air alarms:</B> [tension_master.air_alarms]<BR>
<B>Adminhelps:</B> [tension_master.adminhelps]<BR>
<B>Ghosts:</B> [numghosts]<BR>
<BR>
<B>Current Status</B><BR>
<B>Tension:</B> [tension_master.score]<BR>
<a href='?src=\ref[tension_master];addScore=1'>Increase Tension by 50000</a><br>
<B>Tension per player:</B> [tension_master.score/tension_master.get_num_players()]<BR>
<B>Tensioner Debug Data:</B> R1:[tension_master.round1] R2:[tension_master.round2] R3:[tension_master.round3] R4:[tension_master.round4] ES: [tension_master.eversupressed] CD: [tension_master.cooldown]<br>
<B>Current Tensioner Status:</B> [config.Tensioner_Active]. <a href='?src=\ref[tension_master];ToggleStatus=1'>Toggle?</a><br>
<B>Recommendations:</B> All the modes. All of them. Press all of them.<BR>
<BR>
<a href='?src=\ref[tension_master];makeTratior=1'>Make Tratiors</a><br>
<a href='?src=\ref[tension_master];makeChanglings=1'>Make Changlings</a><br>
<a href='?src=\ref[tension_master];makeRevs=1'>Make Revs</a><br>
<a href='?src=\ref[tension_master];makeWizard=1'>Make Wizard (Requires Ghosts)</a><br>
<a href='?src=\ref[tension_master];makeCult=1'>Make Cult</a><br>
<a href='?src=\ref[tension_master];makeNukeTeam=1'>Make Nuke Team (Requires Ghosts)</a><br>
<a href='?src=\ref[tension_master];makeMalf=1'>Make Malf AI</a><br>
<a href='?src=\ref[tension_master];makeSpaceNinja=1'>Make Space Ninja (Requires Ghosts)</a><br>
<a href='?src=\ref[tension_master];makeAliens=1'>Make Aliens (Requires Ghosts)</a><br>
<a href='?src=\ref[tension_master];makeDeathsquad=1'>Make Deathsquad (Syndicate) (Requires Ghosts)</a><br>
<a href='?src=\ref[tension_master];makeBorgDeathsquad=1'>Make Deathsquad (Borg) (Requires Ghosts)</a><br>
<br>
"}
for(var/game in tension_master.antagonistmodes)
output += "<font size = 2>Points required/Probability for [game]: [tension_master.antagonistmodes[game]]<br></font>"
usr << browse(output,"window=tensionreport;size=480x480")
feedback_add_details("admin_verb","STR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_detail("admin_verb","KLAG") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
*/
+1 -1
View File
@@ -31,7 +31,7 @@
set desc = "Give somebody access to any session logfiles saved to the /log/runtime/ folder."
set category = null
if( !src.holder || holder.rank != "Game Master" )
if( !src.holder )
src << "<font color='red'>Only Game Masters may use this command.</font>"
return
-23
View File
@@ -1,23 +0,0 @@
var/global/gimmick_hat = null
// irreversable, for now
/client/proc/cmd_admin_christmas()
set category = "Fun"
set name = "Christmas Time"
if(!holder)
src << "Only administrators may use this command."
return
if(!gimmick_hat)
log_admin("[usr.key] has started Christmas!")
message_admins("<font color='blue'>[usr.key] has started Christmas!</font>")
// handle pre-existing hats
gimmick_hat = "santahat"
else
log_admin("[usr.key] has stopped Christmas!")
message_admins("<font color='blue'>[usr.key] has stopped Christmas!</font>")
// handle pre-existing hats
gimmick_hat = null
+146 -139
View File
@@ -23,7 +23,7 @@ var/camera_range_display_status = 0
var/intercom_range_display_status = 0
/obj/effect/debugging/camera_range
icon = '480x480.dmi'
icon = 'icons/480x480.dmi'
icon_state = "25percent"
New()
@@ -31,180 +31,187 @@ var/intercom_range_display_status = 0
src.pixel_y = -224
/obj/effect/debugging/marker
icon = 'areas.dmi'
icon = 'icons/turf/areas.dmi'
icon_state = "yellow"
/client/proc
/obj/effect/debugging/marker/Move()
return 0
do_not_use_these()
set category = "Mapping"
set name = "-None of these are for ingame use!!"
/client/proc/do_not_use_these()
set category = "Mapping"
set name = "-None of these are for ingame use!!"
..()
..()
camera_view()
set category = "Mapping"
set name = "Camera Range Display"
/client/proc/camera_view()
set category = "Mapping"
set name = "Camera Range Display"
if(camera_range_display_status)
camera_range_display_status = 0
else
camera_range_display_status = 1
if(camera_range_display_status)
camera_range_display_status = 0
else
camera_range_display_status = 1
for(var/obj/effect/debugging/camera_range/C in world)
del(C)
for(var/obj/effect/debugging/camera_range/C in world)
del(C)
if(camera_range_display_status)
for(var/obj/machinery/camera/C in world)
new/obj/effect/debugging/camera_range(C.loc)
//feedback_add_details("admin_verb","mCRD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
if(camera_range_display_status)
for(var/obj/machinery/camera/C in Cameras)
new/obj/effect/debugging/camera_range(C.loc)
feedback_add_details("admin_verb","mCRD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
sec_camera_report()
set category = "Mapping"
set name = "Camera Report"
/client/proc/sec_camera_report()
set category = "Mapping"
set name = "Camera Report"
if(!master_controller)
alert(usr,"Master_controller not found.","Sec Camera Report")
return 0
if(!master_controller)
alert(usr,"Master_controller not found.","Sec Camera Report")
return 0
var/list/obj/machinery/camera/CL = list()
var/list/obj/machinery/camera/CL = list()
for(var/obj/machinery/camera/C in world)
CL += C
for(var/obj/machinery/camera/C in Cameras)
CL += C
var/output = {"<B>CAMERA ANNOMALITIES REPORT</B><HR>
var/output = {"<B>CAMERA ANNOMALITIES REPORT</B><HR>
<B>The following annomalities have been detected. The ones in red need immediate attention: Some of those in black may be intentional.</B><BR><ul>"}
for(var/obj/machinery/camera/C1 in CL)
for(var/obj/machinery/camera/C2 in CL)
if(C1 != C2)
if(C1.c_tag == C2.c_tag)
output += "<li><font color='red'>c_tag match for sec. cameras at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc]) and \[[C2.x], [C2.y], [C2.z]\] ([C2.loc.loc]) - c_tag is [C1.c_tag]</font></li>"
if(C1.loc == C2.loc && C1.dir == C2.dir && C1.pixel_x == C2.pixel_x && C1.pixel_y == C2.pixel_y)
output += "<li><font color='red'>FULLY overlapping sec. cameras at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc]) Networks: [C1.network] and [C2.network]</font></li>"
if(C1.loc == C2.loc)
output += "<li>overlapping sec. cameras at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc]) Networks: [C1.network] and [C2.network]</font></li>"
var/turf/T = get_step(C1,turn(C1.dir,180))
if(!T || !isturf(T) || !T.density )
if(!(locate(/obj/structure/grille,T)))
var/window_check = 0
for(var/obj/structure/window/W in T)
if (W.dir == turn(C1.dir,180) || W.dir in list(5,6,9,10) )
window_check = 1
break
if(!window_check)
output += "<li><font color='red'>Camera not connected to wall at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc]) Network: [C1.network]</color></li>"
for(var/obj/machinery/camera/C1 in CL)
for(var/obj/machinery/camera/C2 in CL)
if(C1 != C2)
if(C1.c_tag == C2.c_tag)
output += "<li><font color='red'>c_tag match for sec. cameras at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc]) and \[[C2.x], [C2.y], [C2.z]\] ([C2.loc.loc]) - c_tag is [C1.c_tag]</font></li>"
if(C1.loc == C2.loc && C1.dir == C2.dir && C1.pixel_x == C2.pixel_x && C1.pixel_y == C2.pixel_y)
output += "<li><font color='red'>FULLY overlapping sec. cameras at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc]) Networks: [C1.network] and [C2.network]</font></li>"
if(C1.loc == C2.loc)
output += "<li>overlapping sec. cameras at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc]) Networks: [C1.network] and [C2.network]</font></li>"
var/turf/T = get_step(C1,turn(C1.dir,180))
if(!T || !isturf(T) || !T.density )
if(!(locate(/obj/structure/grille,T)))
var/window_check = 0
for(var/obj/structure/window/W in T)
if (W.dir == turn(C1.dir,180) || W.dir in list(5,6,9,10) )
window_check = 1
break
if(!window_check)
output += "<li><font color='red'>Camera not connected to wall at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc]) Network: [C1.network]</color></li>"
output += "</ul>"
usr << browse(output,"window=airreport;size=1000x500")
//feedback_add_details("admin_verb","mCRP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
output += "</ul>"
usr << browse(output,"window=airreport;size=1000x500")
feedback_add_details("admin_verb","mCRP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
intercom_view()
set category = "Mapping"
set name = "Intercom Range Display"
/client/proc/intercom_view()
set category = "Mapping"
set name = "Intercom Range Display"
if(intercom_range_display_status)
intercom_range_display_status = 0
else
intercom_range_display_status = 1
if(intercom_range_display_status)
intercom_range_display_status = 0
else
intercom_range_display_status = 1
for(var/obj/effect/debugging/marker/M in world)
del(M)
for(var/obj/effect/debugging/marker/M in world)
del(M)
if(intercom_range_display_status)
for(var/obj/item/device/radio/intercom/I in world)
for(var/turf/T in orange(7,I))
var/obj/effect/debugging/marker/F = new/obj/effect/debugging/marker(T)
if (!(F in view(7,I.loc)))
del(F)
//feedback_add_details("admin_verb","mIRD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
if(intercom_range_display_status)
for(var/obj/item/device/radio/intercom/I in world)
for(var/turf/T in orange(7,I))
var/obj/effect/debugging/marker/F = new/obj/effect/debugging/marker(T)
if (!(F in view(7,I.loc)))
del(F)
feedback_add_details("admin_verb","mIRD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
enable_debug_verbs()
set category = "Debug"
set name = "Debug verbs"
src.verbs += /client/proc/do_not_use_these //-errorage
src.verbs += /client/proc/camera_view //-errorage
src.verbs += /client/proc/sec_camera_report //-errorage
src.verbs += /client/proc/intercom_view //-errorage
//src.verbs += /client/proc/air_status //Air things
src.verbs += /client/proc/Cell //More air things
src.verbs += /client/proc/atmosscan //check plumbing
src.verbs += /client/proc/powerdebug //check power
src.verbs += /client/proc/count_objects_on_z_level
src.verbs += /client/proc/count_objects_all
src.verbs += /client/proc/cmd_assume_direct_control //-errorage
//src.verbs += /client/proc/jump_to_dead_group
src.verbs += /client/proc/startSinglo
src.verbs += /client/proc/ticklag //allows you to set the ticklag.
src.verbs += /client/proc/cmd_admin_grantfullaccess
//src.verbs += /client/proc/cmd_admin_rejuvenate
/client/proc/enable_debug_verbs()
set category = "Debug"
set name = "Debug verbs"
src.verbs += /client/proc/do_not_use_these //-errorage
src.verbs += /client/proc/camera_view //-errorage
src.verbs += /client/proc/sec_camera_report //-errorage
src.verbs += /client/proc/intercom_view //-errorage
src.verbs += /client/proc/air_status //Air things
src.verbs += /client/proc/Cell //More air things
src.verbs += /client/proc/atmosscan //check plumbing
src.verbs += /client/proc/powerdebug //check power
src.verbs += /client/proc/count_objects_on_z_level
src.verbs += /client/proc/count_objects_all
src.verbs += /client/proc/cmd_assume_direct_control //-errorage
src.verbs += /client/proc/jump_to_dead_group
src.verbs += /client/proc/startSinglo
src.verbs += /client/proc/ticklag //allows you to set the ticklag.
src.verbs += /client/proc/cmd_admin_grantfullaccess
//src.verbs += /client/proc/cmd_admin_rejuvenate
//feedback_add_details("admin_verb","mDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","mDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
count_objects_on_z_level()
set category = "Mapping"
set name = "Count Objects On Level"
var/level = input("Which z-level?","Level?") as text
if(!level) return
var/num_level = text2num(level)
if(!num_level) return
if(!isnum(num_level)) return
/client/proc/count_objects_on_z_level()
set category = "Mapping"
set name = "Count Objects On Level"
var/level = input("Which z-level?","Level?") as text
if(!level) return
var/num_level = text2num(level)
if(!num_level) return
if(!isnum(num_level)) return
var/type_text = input("Which type path?","Path?") as text
if(!type_text) return
var/type_path = text2path(type_text)
if(!type_path) return
var/type_text = input("Which type path?","Path?") as text
if(!type_text) return
var/type_path = text2path(type_text)
if(!type_path) return
var/count = 0
var/count = 0
var/list/atom/atom_list = list()
var/list/atom/atom_list = list()
for(var/atom/A in world)
if(istype(A,type_path))
var/turf/B = get_turf(A)
if(istype(B) && B.z == num_level)
for(var/atom/A in world)
if(istype(A,type_path))
var/atom/B = A
while(!(isturf(B.loc)))
if(B && B.loc)
B = B.loc
else
break
if(B)
if(B.z == num_level)
count++
atom_list += A
/*
var/atom/temp_atom
for(var/i = 0; i <= (atom_list.len/10); i++)
var/line = ""
for(var/j = 1; j <= 10; j++)
if(i*10+j <= atom_list.len)
temp_atom = atom_list[i*10+j]
line += " no.[i+10+j]@\[[temp_atom.x], [temp_atom.y], [temp_atom.z]\]; "
world << line*/
/*
var/atom/temp_atom
for(var/i = 0; i <= (atom_list.len/10); i++)
var/line = ""
for(var/j = 1; j <= 10; j++)
if(i*10+j <= atom_list.len)
temp_atom = atom_list[i*10+j]
line += " no.[i+10+j]@\[[temp_atom.x], [temp_atom.y], [temp_atom.z]\]; "
world << line*/
world << "There are [count] objects of type [type_path] on z-level [num_level]"
//feedback_add_details("admin_verb","mOBJZ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
world << "There are [count] objects of type [type_path] on z-level [num_level]"
feedback_add_details("admin_verb","mOBJZ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
count_objects_all()
set category = "Mapping"
set name = "Count Objects All"
/client/proc/count_objects_all()
set category = "Mapping"
set name = "Count Objects All"
var/type_text = input("Which type path?","") as text
if(!type_text) return
var/type_path = text2path(type_text)
if(!type_path) return
var/type_text = input("Which type path?","") as text
if(!type_text) return
var/type_path = text2path(type_text)
if(!type_path) return
var/count = 0
var/count = 0
for(var/atom/A in world)
if(istype(A,type_path))
count++
/*
var/atom/temp_atom
for(var/i = 0; i <= (atom_list.len/10); i++)
var/line = ""
for(var/j = 1; j <= 10; j++)
if(i*10+j <= atom_list.len)
temp_atom = atom_list[i*10+j]
line += " no.[i+10+j]@\[[temp_atom.x], [temp_atom.y], [temp_atom.z]\]; "
world << line*/
for(var/atom/A in world)
if(istype(A,type_path))
count++
/*
var/atom/temp_atom
for(var/i = 0; i <= (atom_list.len/10); i++)
var/line = ""
for(var/j = 1; j <= 10; j++)
if(i*10+j <= atom_list.len)
temp_atom = atom_list[i*10+j]
line += " no.[i+10+j]@\[[temp_atom.x], [temp_atom.y], [temp_atom.z]\]; "
world << line*/
world << "There are [count] objects of type [type_path] in the game world"
//feedback_add_details("admin_verb","mOBJ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
world << "There are [count] objects of type [type_path] in the game world"
feedback_add_details("admin_verb","mOBJ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+20 -20
View File
@@ -18,7 +18,7 @@
return
src.massmodify_variables(A, var_name, method)
//feedback_add_details("admin_verb","MEV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","MEV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/massmodify_variables(var/atom/O, var/var_name = "", var/method = 0)
@@ -138,7 +138,7 @@
O.vars[variable] = initial(O.vars[variable])
if(method)
if(istype(O, /mob))
for(var/mob/M in world)
for(var/mob/M in mob_list)
if ( istype(M , O.type) )
M.vars[variable] = O.vars[variable]
@@ -154,7 +154,7 @@
else
if(istype(O, /mob))
for(var/mob/M in world)
for(var/mob/M in mob_list)
if (M.type == O.type)
M.vars[variable] = O.vars[variable]
@@ -178,7 +178,7 @@
if(method)
if(istype(O, /mob))
for(var/mob/M in world)
for(var/mob/M in mob_list)
if ( istype(M , O.type) )
M.vars[variable] = O.vars[variable]
@@ -193,7 +193,7 @@
A.vars[variable] = O.vars[variable]
else
if(istype(O, /mob))
for(var/mob/M in world)
for(var/mob/M in mob_list)
if (M.type == O.type)
M.vars[variable] = O.vars[variable]
@@ -213,16 +213,16 @@
if(new_value == null) return
if(variable=="luminosity")
O.ul_SetLuminosity(new_value)
O.sd_SetLuminosity(new_value)
else
O.vars[variable] = new_value
if(method)
if(istype(O, /mob))
for(var/mob/M in world)
for(var/mob/M in mob_list)
if ( istype(M , O.type) )
if(variable=="luminosity")
M.ul_SetLuminosity(new_value)
M.sd_SetLuminosity(new_value)
else
M.vars[variable] = O.vars[variable]
@@ -230,7 +230,7 @@
for(var/obj/A in world)
if ( istype(A , O.type) )
if(variable=="luminosity")
A.ul_SetLuminosity(new_value)
A.sd_SetLuminosity(new_value)
else
A.vars[variable] = O.vars[variable]
@@ -238,16 +238,16 @@
for(var/turf/A in world)
if ( istype(A , O.type) )
if(variable=="luminosity")
A.ul_SetLuminosity(new_value)
A.sd_SetLuminosity(new_value)
else
A.vars[variable] = O.vars[variable]
else
if(istype(O, /mob))
for(var/mob/M in world)
for(var/mob/M in mob_list)
if (M.type == O.type)
if(variable=="luminosity")
M.ul_SetLuminosity(new_value)
M.sd_SetLuminosity(new_value)
else
M.vars[variable] = O.vars[variable]
@@ -255,7 +255,7 @@
for(var/obj/A in world)
if (A.type == O.type)
if(variable=="luminosity")
A.ul_SetLuminosity(new_value)
A.sd_SetLuminosity(new_value)
else
A.vars[variable] = O.vars[variable]
@@ -263,7 +263,7 @@
for(var/turf/A in world)
if (A.type == O.type)
if(variable=="luminosity")
A.ul_SetLuminosity(new_value)
A.sd_SetLuminosity(new_value)
else
A.vars[variable] = O.vars[variable]
@@ -274,7 +274,7 @@
O.vars[variable] = new_value
if(method)
if(istype(O, /mob))
for(var/mob/M in world)
for(var/mob/M in mob_list)
if ( istype(M , O.type) )
M.vars[variable] = O.vars[variable]
@@ -289,7 +289,7 @@
A.vars[variable] = O.vars[variable]
else
if(istype(O, /mob))
for(var/mob/M in world)
for(var/mob/M in mob_list)
if (M.type == O.type)
M.vars[variable] = O.vars[variable]
@@ -310,7 +310,7 @@
if(method)
if(istype(O, /mob))
for(var/mob/M in world)
for(var/mob/M in mob_list)
if ( istype(M , O.type) )
M.vars[variable] = O.vars[variable]
@@ -325,7 +325,7 @@
A.vars[variable] = O.vars[variable]
else
if(istype(O, /mob))
for(var/mob/M in world)
for(var/mob/M in mob_list)
if (M.type == O.type)
M.vars[variable] = O.vars[variable]
@@ -345,7 +345,7 @@
O.vars[variable] = new_value
if(method)
if(istype(O, /mob))
for(var/mob/M in world)
for(var/mob/M in mob_list)
if ( istype(M , O.type) )
M.vars[variable] = O.vars[variable]
@@ -361,7 +361,7 @@
else
if(istype(O, /mob))
for(var/mob/M in world)
for(var/mob/M in mob_list)
if (M.type == O.type)
M.vars[variable] = O.vars[variable]
+39 -116
View File
@@ -9,18 +9,7 @@ var/list/forbidden_varedit_object_types = list(
set name = "Edit Variables"
set desc="(target) Edit a target item's variables"
src.modify_variables(O)
//feedback_add_details("admin_verb","EDITV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_modify_ref_variables(var/target as text)
set category = "Debug"
set name = "Edit Variables (Reference)"
set desc="(target) Edit a target item's variables"
var/obj/I = locate(target)
if(!I)
usr << "ERROR: Object could not be located!"
return
src.modify_variables(I)
//feedback_add_details("admin_verb","EDITV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","EDITV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_modify_ticker_variables()
set category = "Debug"
@@ -30,7 +19,7 @@ var/list/forbidden_varedit_object_types = list(
src << "Game hasn't started yet."
else
src.modify_variables(ticker)
// feedback_add_details("admin_verb","ETV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","ETV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/mod_list_add_ass() //haha
@@ -62,24 +51,10 @@ var/list/forbidden_varedit_object_types = list(
var_value = input("Enter type:","Type") as null|anything in typesof(/obj,/mob,/area,/turf)
if("reference")
switch(alert("Would you like to enter a specific object, or search for it from the world?","Choose!","Specifc UID (Hexadecimal number)", "Search"))
if("Specifc UID (Hexadecimal number)")
var/UID = input("Type in UID, without the leading 0x","Type in UID") as text|null
if(!UID) return
var/temp_variable = locate("\[0x[UID]\]")
if(!temp_variable)
usr << "ERROR. Could not locate referenced object."
return
switch(alert("You have chosen [temp_variable], in [get_area(temp_variable)]. Are you sure?","You sure?","Yes","NONOCANCEL!"))
if("Yes")
var_value = temp_variable
if("NONOCANCEL!")
return
if("Search")
var_value = input("Select reference:","Reference") as null|mob|obj|turf|area in world
var_value = input("Select reference:","Reference") as null|mob|obj|turf|area in world
if("mob reference")
var_value = input("Select reference:","Reference") as null|mob in get_sorted_mobs()
var_value = input("Select reference:","Reference") as null|mob in world
if("file")
var_value = input("Pick file:","File") as null|file
@@ -116,39 +91,25 @@ var/list/forbidden_varedit_object_types = list(
switch(class)
if("text")
var_value = input("Enter new text:","Text") as null|text
var_value = input("Enter new text:","Text") as text
if("num")
var_value = input("Enter new number:","Num") as null|num
var_value = input("Enter new number:","Num") as num
if("type")
var_value = input("Enter type:","Type") in typesof(/obj,/mob,/area,/turf)
if("reference")
switch(alert("Would you like to enter a specific object, or search for it from the world?","Choose!","Specifc UID (Hexadecimal number)", "Search"))
if("Specifc UID (Hexadecimal number)")
var/UID = input("Type in UID, without the leading 0x","Type in UID") as text|null
if(!UID) return
var/temp_variable = locate("\[0x[UID]\]")
if(!temp_variable)
usr << "ERROR. Could not locate referenced object."
return
switch(alert("You have chosen [temp_variable], in [get_area(temp_variable)]. Are you sure?","You sure?","Yes","NONOCANCEL!"))
if("Yes")
var_value = temp_variable
if("NONOCANCEL!")
return
if("Search")
var_value = input("Select reference:","Reference") as null|mob|obj|turf|area in world
var_value = input("Select reference:","Reference") as mob|obj|turf|area in world
if("mob reference")
var_value = input("Select reference:","Reference") as null|mob in get_sorted_mobs()
var_value = input("Select reference:","Reference") as mob in world
if("file")
var_value = input("Pick file:","File") as null|file
var_value = input("Pick file:","File") as file
if("icon")
var_value = input("Pick icon:","Icon") as null|icon
var_value = input("Pick icon:","Icon") as icon
if("marked datum")
var_value = holder.marked_datum
@@ -166,7 +127,6 @@ var/list/forbidden_varedit_object_types = list(
if(!istype(L,/list)) src << "Not a List."
var/list/locked = list("vars", "key", "ckey", "client", "firemut", "ishulk", "telekinesis", "xray", "virus", "viruses", "cuffed", "ka", "last_eaten", "urine", "poo", "icon", "icon_state")
var/list/names = sortList(L)
var/variable = input("Which var?","Var") as null|anything in names + "(ADD VAR)"
@@ -178,11 +138,6 @@ var/list/forbidden_varedit_object_types = list(
if(!variable)
return
var/associative
if(istext(variable) && !isnull(L[variable]))
associative = variable
variable = L[variable]
var/default
var/dir
@@ -255,10 +210,10 @@ var/list/forbidden_varedit_object_types = list(
var/class = "text"
if(src.holder && src.holder.marked_datum)
class = input("What kind of variable?","Variable Type",default) as null|anything in list("text",
"num","type","reference","mob reference", "icon","file","list","edit referenced object","restore to default","marked datum ([holder.marked_datum.type])")
"num","type","reference","mob reference", "icon","file","list","edit referenced object","restore to default","marked datum ([holder.marked_datum.type])", "DELETE FROM LIST")
else
class = input("What kind of variable?","Variable Type",default) as null|anything in list("text",
"num","type","reference","mob reference", "icon","file","list","edit referenced object","restore to default")
"num","type","reference","mob reference", "icon","file","list","edit referenced object","restore to default", "DELETE FROM LIST")
if(!class)
return
@@ -266,76 +221,48 @@ var/list/forbidden_varedit_object_types = list(
if(holder.marked_datum && class == "marked datum ([holder.marked_datum.type])")
class = "marked datum"
switch(class)
switch(class) //Spits a runtime error if you try to modify an entry in the contents list. Dunno how to fix it, yet.
if("list")
mod_list(variable)
if("restore to default")
if(associative)
L[associative] = initial(L[associative])
else
variable = initial(variable)
L[L.Find(variable)]=initial(variable)
if("edit referenced object")
modify_variables(variable)
if("(DELETE FROM LIST)")
if(associative)
L.Remove(associative)
return
L.Remove(variable)
if("DELETE FROM LIST")
L -= variable
return
if("text")
variable = input("Enter new text:","Text",\
variable) as null|text
L[L.Find(variable)] = input("Enter new text:","Text") as text
if("num")
variable = input("Enter new number:","Num",\
variable) as null|num
L[L.Find(variable)] = input("Enter new number:","Num") as num
if("type")
variable = input("Enter type:","Type",variable) \
in typesof(/obj,/mob,/area,/turf)
L[L.Find(variable)] = input("Enter type:","Type") in typesof(/obj,/mob,/area,/turf)
if("reference")
switch(alert("Would you like to enter a specific object, or search for it from the world?","Choose!","Specifc UID (Hexadecimal number)", "Search"))
if("Specifc UID (Hexadecimal number)")
var/UID = input("Type in UID, without the leading 0x","Type in UID") as null|text
if(!UID) return
var/temp_variable = locate("\[0x[UID]\]")
if(!temp_variable)
usr << "ERROR. Could not locate referenced object."
return
switch(alert("You have chosen [temp_variable], in [get_area(temp_variable)]. Are you sure?","You sure?","Yes","NONOCANCEL!"))
if("Yes")
variable = temp_variable
if("NONOCANCEL!")
return
if("Search")
variable = input("Select reference:","Reference") as null|mob|obj|turf|area in world
L[L.Find(variable)] = input("Select reference:","Reference") as mob|obj|turf|area in world
if("mob reference")
variable = input("Select reference:","Reference",\
variable) as null|mob in get_sorted_mobs()
L[L.Find(variable)] = input("Select reference:","Reference") as mob in world
if("file")
variable = input("Pick file:","File",variable) \
as null|file
L[L.Find(variable)] = input("Pick file:","File") as file
if("icon")
variable = input("Pick icon:","Icon",variable) \
as null|icon
L[L.Find(variable)] = input("Pick icon:","Icon") as icon
if("marked datum")
variable = holder.marked_datum
L[L.Find(variable)] = holder.marked_datum
if(associative)
L[associative] = variable
/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")
var/list/locked = list("vars", "key", "ckey", "client", "firemut", "ishulk", "telekinesis", "xray", "virus", "cuffed", "ka", "last_eaten", "icon", "icon_state", "mutantrace")
if(!src.holder)
src << "Only administrators may use this command."
@@ -531,7 +458,17 @@ var/list/forbidden_varedit_object_types = list(
if(variable=="luminosity")
var/var_new = input("Enter new number:","Num",O.vars[variable]) as null|num
if(var_new == null) return
O.ul_SetLuminosity(var_new)
O.sd_SetLuminosity(var_new)
else if(variable=="stat")
var/var_new = input("Enter new number:","Num",O.vars[variable]) as null|num
if(var_new == null) return
if((O.vars[variable] == 2) && (var_new < 2))//Bringing the dead back to life
dead_mob_list -= O
living_mob_list += O
if((O.vars[variable] < 2) && (var_new == 2))//Kill he
living_mob_list -= O
dead_mob_list += O
O.vars[variable] = var_new
else
var/var_new = input("Enter new number:","Num",O.vars[variable]) as null|num
if(var_new==null) return
@@ -543,27 +480,12 @@ var/list/forbidden_varedit_object_types = list(
O.vars[variable] = var_new
if("reference")
var/var_new
switch(alert("Would you like to enter a specific object, or search for it from the world?","Choose!","Specifc UID (Hexadecimal number)", "Search"))
if("Specifc UID (Hexadecimal number)")
var/UID = input("Type in UID, without the leading 0x","Type in UID") as text|null
if(!UID) return
var/temp_variable = locate("\[0x[UID]\]")
if(!temp_variable)
usr << "ERROR. Could not locate referenced object."
return
switch(alert("You have chosen [temp_variable], in [get_area(temp_variable)]. Are you sure?","You sure?","Yes","NONOCANCEL!"))
if("Yes")
var_new = temp_variable
if("NONOCANCEL!")
return
if("Search")
var_new = input("Select reference:","Reference") as null|mob|obj|turf|area in world
var/var_new = input("Select reference:","Reference",O.vars[variable]) as null|mob|obj|turf|area in world
if(var_new==null) return
O.vars[variable] = var_new
if("mob reference")
var/var_new = input("Select reference:","Reference",O.vars[variable]) as null|mob in get_sorted_mobs()
var/var_new = input("Select reference:","Reference",O.vars[variable]) as null|mob in world
if(var_new==null) return
O.vars[variable] = var_new
@@ -580,6 +502,7 @@ var/list/forbidden_varedit_object_types = list(
if("marked datum")
O.vars[variable] = holder.marked_datum
world.log << "### VarEdit by [src]: [O.type] [variable]=[html_encode("[O.vars[variable]]")]"
log_admin("[key_name(src)] modified [original_name]'s [variable] to [O.vars[variable]]")
message_admins("[key_name_admin(src)] modified [original_name]'s [variable] to [O.vars[variable]]", 1)
+11 -10
View File
@@ -8,16 +8,17 @@
if(alert("BEGIN THE TOURNAMENT?",,"Yes","No")=="No")
return
//feedback_add_details("admin_verb","TCBOO") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
for(var/mob/living/carbon/human/H in world)
feedback_add_details("admin_verb","TCBOO") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
for(var/mob/living/carbon/human/H in player_list)
if(H.stat == 2 || !(H.client)) continue
if(is_special_character(H)) continue
ticker.mode.traitors += H.mind
H.mind.special_role = "traitor"
var/datum/objective/steal/nuke_disk/steal_objective = new
var/datum/objective/steal/steal_objective = new
steal_objective.owner = H.mind
steal_objective.set_target("nuclear authentication disk")
H.mind.objectives += steal_objective
var/datum/objective/hijack/hijack_objective = new
@@ -35,12 +36,12 @@
continue
del(I)
H.equip_if_possible(new /obj/item/clothing/under/kilt(H), H.slot_w_uniform)
H.equip_if_possible(new /obj/item/device/radio/headset/heads/captain(H), H.slot_ears)
H.equip_if_possible(new /obj/item/clothing/head/beret(H), H.slot_head)
H.equip_if_possible(new /obj/item/weapon/claymore(H), H.slot_l_hand)
H.equip_if_possible(new /obj/item/clothing/shoes/combat(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/weapon/pinpointer(H.loc), H.slot_l_store)
H.equip_to_slot_or_del(new /obj/item/clothing/under/kilt(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(H), slot_ears)
H.equip_to_slot_or_del(new /obj/item/clothing/head/beret(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/weapon/claymore(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/weapon/pinpointer(H.loc), slot_l_store)
var/obj/item/weapon/card/id/W = new(H)
W.name = "[H.real_name]'s ID Card"
@@ -49,7 +50,7 @@
W.access += get_all_centcom_access()
W.assignment = "Highlander"
W.registered_name = H.real_name
H.equip_if_possible(W, H.slot_wear_id)
H.equip_to_slot_or_del(W, slot_wear_id)
message_admins("\blue [key_name_admin(usr)] used THERE CAN BE ONLY ONE!", 1)
log_admin("[key_name(usr)] used there can be only one.")
+9 -12
View File
@@ -2,7 +2,6 @@
set category = "Fun"
set name = "Play Global Sound"
//if(Debug2)
if(!src.holder)
src << "Only administrators may use this command."
return
@@ -15,23 +14,21 @@
if(src.holder.rank == "Game Master" || src.holder.rank == "Game Admin" || src.holder.rank == "Badmin")
log_admin("[key_name(src)] played sound [S]")
message_admins("[key_name_admin(src)] played sound [S]", 1)
for(var/mob/M in world)
if(M.client)
if(M.client.midis)
M << uploaded_sound
for(var/mob/M in player_list)
if(M.client.midis)
M << uploaded_sound
else
if(usr.client.canplaysound)
usr.client.canplaysound = 0
log_admin("[key_name(src)] played sound [S]")
message_admins("[key_name_admin(src)] played sound [S]", 1)
for(var/mob/M in world)
if(M.client)
if(M.client.midis)
M << uploaded_sound
for(var/mob/M in player_list)
if(M.client.midis)
M << uploaded_sound
else
usr << "You already used up your jukebox monies this round!"
del(uploaded_sound)
//feedback_add_details("admin_verb","PGS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","PGS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/play_local_sound(S as sound)
@@ -45,9 +42,9 @@
if(src.holder.rank == "Game Master" || src.holder.rank == "Game Admin")
log_admin("[key_name(src)] played a local sound [S]")
message_admins("[key_name_admin(src)] played a local sound [S]", 1)
playsound(get_turf(src.mob), S, 50, 0, 0)
playsound(get_turf_loc(src.mob), S, 50, 0, 0)
return
//feedback_add_details("admin_verb","PLS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","PLS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/*
+5 -2
View File
@@ -34,14 +34,17 @@
if(usr.control_object && usr.name_archive) //if you have a name archived and if you are actually relassing an object
usr.real_name = usr.name_archive
usr.name = usr.real_name
usr.update_clothing() //So the name is updated properly
if(ishuman(usr))
var/mob/living/carbon/human/H = usr
H.name = H.get_visible_name()
// usr.regenerate_icons() //So the name is updated properly
usr.loc = O.loc // Appear where the object you were controlling is -- TLE
usr.client.eye = usr
usr.control_object = null
feedback_add_details("admin_verb","RO") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/proc/givetestverbs(mob/M as mob in world)
/proc/givetestverbs(mob/M as mob in mob_list)
set desc = "Give this guy possess/release verbs"
set category = "Debug"
set name = "Give Possessing Verbs"
+15 -13
View File
@@ -7,17 +7,21 @@
if (!msg)
return
if (usr.client && (usr.client.muted || usr.client.muted_complete))
return
if (usr.client)
if(usr.client.muted_pray)
return
var/icon/cross = icon('storage.dmi',"bible")
if (src.client.handle_spam_prevention(msg,MUTE_PRAY))
return
for (var/mob/M in world)
if (M.client && M.client.holder && M.client.seeprayers)
M << "\blue \icon[cross] <b><font color=purple>PRAY: </font>[key_name(src, M)] (<A HREF='?src=\ref[M.client.holder];adminplayeropts=\ref[src]'>PP</A>) (<A HREF='?src=\ref[M.client.holder];adminplayervars=\ref[src]'>VV</A>) (<A HREF='?src=\ref[M.client.holder];adminplayersubtlemessage=\ref[src]'>SM</A>) (<A HREF='?src=\ref[M.client.holder];adminplayerobservejump=\ref[src]'>JMP</A>) (<A HREF='?src=\ref[M.client.holder];secretsadmin=check_antagonist'>CA</A>) (<A HREF='?src=\ref[M.client.holder];adminspawncookie=\ref[src]'>SC</a>):</b> [msg]"
var/icon/cross = icon('icons/obj/storage.dmi',"bible")
for (var/client/C in admin_list)
if (C.seeprayers)
C << "\blue \icon[cross] <b><font color=purple>PRAY: </font>[key_name(src, C)] (<A HREF='?src=\ref[C.holder];adminmoreinfo=\ref[src]'>?</A>) (<A HREF='?src=\ref[C.holder];adminplayeropts=\ref[src]'>PP</A>) (<A HREF='?src=\ref[C.holder];adminplayervars=\ref[src]'>VV</A>) (<A HREF='?src=\ref[C.holder];adminplayersubtlemessage=\ref[src]'>SM</A>) (<A HREF='?src=\ref[C.holder];adminplayerobservejump=\ref[src]'>JMP</A>) (<A HREF='?src=\ref[C.holder];secretsadmin=check_antagonist'>CA</A>) (<A HREF='?src=\ref[C.holder];adminspawncookie=\ref[src]'>SC</a>):</b> [msg]"
usr << "Your prayers have been received by the gods."
//feedback_add_details("admin_verb","PR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","PR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
//log_admin("HELP: [key_name(src)]: [msg]")
@@ -27,9 +31,8 @@
// log_admin("[key_name(Sender)] sent a message to Centcomm! The message was [msg]") // Handled somewhere else
for (var/mob/M in world)
if (M.client && M.client.holder && M.client.holder.level != 0)
M << "\blue <b><font color=orange>CENTCOMM:</font>[key_name(Sender, M)] (<A HREF='?src=\ref[M.client.holder];adminplayeropts=\ref[Sender]'>PP</A>) (<A HREF='?src=\ref[M.client.holder];adminplayervars=\ref[Sender]'>VV</A>) (<A HREF='?src=\ref[M.client.holder];adminplayersubtlemessage=\ref[Sender]'>SM</A>) (<A HREF='?src=\ref[M.client.holder];adminplayerobservejump=\ref[Sender]'>JMP</A>) (<A HREF='?src=\ref[M.client.holder];secretsadmin=check_antagonist'>CA</A>) (<A HREF='?src=\ref[M.client.holder];BlueSpaceArtillery=\ref[Sender]'>BSA</A>) (<A HREF='?src=\ref[M.client.holder];CentcommReply=\ref[Sender]'>RPLY</A>):</b> [msg]"
for (var/client/C in admin_list)
C << "\blue <b><font color=orange>CENTCOMM:</font>[key_name(Sender, C)] (<A HREF='?src=\ref[C.holder];adminplayeropts=\ref[Sender]'>PP</A>) (<A HREF='?src=\ref[C.holder];adminplayervars=\ref[Sender]'>VV</A>) (<A HREF='?src=\ref[C.holder];adminplayersubtlemessage=\ref[Sender]'>SM</A>) (<A HREF='?src=\ref[C.holder];adminplayerobservejump=\ref[Sender]'>JMP</A>) (<A HREF='?src=\ref[C.holder];secretsadmin=check_antagonist'>CA</A>) (<A HREF='?src=\ref[C.holder];BlueSpaceArtillery=\ref[Sender]'>BSA</A>) (<A HREF='?src=\ref[C.holder];CentcommReply=\ref[Sender]'>RPLY</A>):</b> [msg]"
//
/proc/Syndicate_announce(var/text , var/mob/Sender)
@@ -37,7 +40,6 @@
// log_admin("[key_name(Sender)] sent a message to the Syndicate! The message was [msg]") // Handled somewhere else
for (var/mob/M in world)
if (M.client && M.client.holder && M.client.holder.level != 0)
M << "\blue <b><font color=crimson>SYNDICATE:</font>[key_name(Sender, M)] (<A HREF='?src=\ref[M.client.holder];adminplayeropts=\ref[Sender]'>PP</A>) (<A HREF='?src=\ref[M.client.holder];adminplayervars=\ref[Sender]'>VV</A>) (<A HREF='?src=\ref[M.client.holder];adminplayersubtlemessage=\ref[Sender]'>SM</A>) (<A HREF='?src=\ref[M.client.holder];adminplayerobservejump=\ref[Sender]'>JMP</A>) (<A HREF='?src=\ref[M.client.holder];secretsadmin=check_antagonist'>CA</A>) (<A HREF='?src=\ref[M.client.holder];BlueSpaceArtillery=\ref[Sender]'>BSA</A>) (<A HREF='?src=\ref[M.client.holder];SyndicateReply=\ref[Sender]'>RPLY</A>):</b> [msg]"
for (var/client/C in admin_list)
C << "\blue <b><font color=crimson>SYNDICATE:</font>[key_name(Sender, C)] (<A HREF='?src=\ref[C.holder];adminplayeropts=\ref[Sender]'>PP</A>) (<A HREF='?src=\ref[C.holder];adminplayervars=\ref[Sender]'>VV</A>) (<A HREF='?src=\ref[C.holder];adminplayersubtlemessage=\ref[Sender]'>SM</A>) (<A HREF='?src=\ref[C.holder];adminplayerobservejump=\ref[Sender]'>JMP</A>) (<A HREF='?src=\ref[C.holder];secretsadmin=check_antagonist'>CA</A>) (<A HREF='?src=\ref[C.holder];BlueSpaceArtillery=\ref[Sender]'>BSA</A>) (<A HREF='?src=\ref[C.holder];SyndicateReply=\ref[Sender]'>RPLY</A>):</b> [msg]"
//
+263 -283
View File
@@ -1,4 +1,4 @@
/client/proc/cmd_admin_drop_everything(mob/M as mob in world)
/client/proc/cmd_admin_drop_everything(mob/M as mob in mob_list)
set category = null
set name = "Drop Everything"
if(!holder)
@@ -10,13 +10,13 @@
return
for(var/obj/item/W in M)
M.drop_from_slot(W)
M.drop_from_inventory(W)
log_admin("[key_name(usr)] made [key_name(M)] drop everything!")
message_admins("[key_name_admin(usr)] made [key_name_admin(M)] drop everything!", 1)
//feedback_add_details("admin_verb","DEVR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","DEVR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_prison(mob/M as mob in world)
/client/proc/cmd_admin_prison(mob/M as mob in mob_list)
set category = "Admin"
set name = "Prison"
if(!holder)
@@ -28,22 +28,22 @@
return
//strip their stuff before they teleport into a cell :downs:
for(var/obj/item/W in M)
M.drop_from_slot(W)
M.drop_from_inventory(W)
//teleport person to cell
M.Paralyse(5)
sleep(5) //so they black out before warping
M.loc = pick(prisonwarp)
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/prisoner = M
prisoner.equip_if_possible(new /obj/item/clothing/under/color/orange(prisoner), prisoner.slot_w_uniform)
prisoner.equip_if_possible(new /obj/item/clothing/shoes/orange(prisoner), prisoner.slot_shoes)
prisoner.equip_to_slot_or_del(new /obj/item/clothing/under/color/orange(prisoner), slot_w_uniform)
prisoner.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(prisoner), slot_shoes)
spawn(50)
M << "\red You have been sent to the prison station!"
log_admin("[key_name(usr)] sent [key_name(M)] to the prison station.")
message_admins("\blue [key_name_admin(usr)] sent [key_name_admin(M)] to the prison station.", 1)
//feedback_add_details("admin_verb","PRISON") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","PRISON") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_subtle_message(mob/M as mob in world)
/client/proc/cmd_admin_subtle_message(mob/M as mob in mob_list)
set category = "Special Verbs"
set name = "Subtle Message"
@@ -59,11 +59,11 @@
if(usr)
if (usr.client)
if(usr.client.holder)
M << "\bold You think... \italic [msg]"
M << "\bold You hear a voice in your head... \italic [msg]"
log_admin("SubtlePM: [key_name(usr)] -> [key_name(M)] : [msg]")
message_admins("\blue \bold SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]", 1)
//feedback_add_details("admin_verb","SMS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","SMS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_world_narrate() // Allows administrators to fluff events a little easier -- TLE
set category = "Special Verbs"
@@ -80,7 +80,7 @@
world << "[msg]"
log_admin("GlobalNarrate: [key_name(usr)] : [msg]")
message_admins("\blue \bold GlobalNarrate: [key_name_admin(usr)] : [msg]<BR>", 1)
//feedback_add_details("admin_verb","GLN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","GLN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_direct_narrate(var/mob/M) // Targetted narrate -- TLE
set category = "Special Verbs"
@@ -104,27 +104,92 @@
M << msg
log_admin("DirectNarrate: [key_name(usr)] to ([M.name]/[M.key]): [msg]")
message_admins("\blue \bold DirectNarrate: [key_name(usr)] to ([M.name]/[M.key]): [msg]<BR>", 1)
//feedback_add_details("admin_verb","DIRN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","DIRN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_mute(mob/M as mob in world)
/client/proc/cmd_admin_godmode(mob/M as mob in mob_list)
set category = "Special Verbs"
set name = "Admin Mute"
set name = "Godmode"
if(!holder)
src << "Only administrators may use this command."
return
if (M.client && M.client.holder && (M.client.holder.level >= holder.level))
alert("You cannot perform this action. You must be of a higher administrative rank!", null, null, null, null, null)
return
if (M.nodamage == 1)
M.nodamage = 0
usr << "\blue Toggled OFF"
else
M.nodamage = 1
usr << "\blue Toggled ON"
log_admin("[key_name(usr)] has toggled [key_name(M)]'s nodamage to [(M.nodamage ? "On" : "Off")]")
message_admins("[key_name_admin(usr)] has toggled [key_name_admin(M)]'s nodamage to [(M.nodamage ? "On" : "Off")]", 1)
feedback_add_details("admin_verb","GOD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0)
if(!automute)
if(usr && usr.client)
if(!usr.client.holder)
src << "Only administrators may use this command."
return
if (M.client && M.client.holder && (M.client.holder.level >= usr.client.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)
src << "This mob doesn't have a client tied to it."
return
M.client.muted = !M.client.muted
log_admin("[key_name(src)] has [(M.client.muted ? "muted" : "voiced")] [key_name(M)].")
message_admins("[key_name_admin(src)] has [(M.client.muted ? "muted" : "voiced")] [key_name_admin(M)].", 1)
var/muteunmute = 0 //0 = unmuted; 1 = muted
var/mute_string = "unknown"
M << "You have been [(M.client.muted ? "muted" : "voiced")]."
//feedback_add_details("admin_verb","MUTE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
//The '| automute' thing ensures that if an automute is being applied by code, it always mutes to prevent any potential for automute to unmute someone who was muted.
switch(mute_type)
if(MUTE_IC)
M.client.muted_ic = !M.client.muted_ic | automute
muteunmute = M.client.muted_ic
mute_string = "IC (say and emote)"
if(MUTE_OOC)
M.client.muted_ooc = !M.client.muted_ooc | automute
muteunmute = M.client.muted_ooc
mute_string = "OOC"
if(MUTE_PRAY)
M.client.muted_pray = !M.client.muted_pray | automute
muteunmute = M.client.muted_pray
mute_string = "pray"
if(MUTE_ADMINHELP)
M.client.muted_adminhelp = !M.client.muted_adminhelp | automute
muteunmute = M.client.muted_adminhelp
mute_string = "adminhelp, admin PM and ASAY"
if(MUTE_DEADCHAT)
M.client.muted_deadchat = !M.client.muted_deadchat | automute
muteunmute = M.client.muted_deadchat
mute_string = "deadchat and DSAY"
if(MUTE_ALL)
mute_string = "everything"
if( M.client.muted_ic )
M.client.muted_ic = 1
M.client.muted_ooc = 1
M.client.muted_pray = 1
M.client.muted_adminhelp = 1
M.client.muted_deadchat = 1
muteunmute = 1
else
M.client.muted_ic = 0
M.client.muted_ooc = 0
M.client.muted_pray = 0
M.client.muted_adminhelp = 0
M.client.muted_deadchat = 0
muteunmute = 0
if(!automute)
log_admin("[key_name(usr)] has [(muteunmute ? "muted" : "voiced")] [key_name(M)] from [mute_string]")
message_admins("[key_name_admin(usr)] has [(muteunmute ? "muted" : "voiced")] [key_name_admin(M)] from [mute_string].", 1)
M << "You have been [(muteunmute ? "muted" : "voiced")] from [mute_string] by [(usr.client.stealth)?"an admin":"[usr.client]"]."
feedback_add_details("admin_verb","MUTE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else
log_admin("SPAM AUTOMUTE: [(muteunmute ? "muted" : "voiced")] [key_name(M)] from [mute_string]")
message_admins("SPAM AUTOMUTE: [(muteunmute ? "muted" : "voiced")] [key_name_admin(M)] from [mute_string].", 1)
M << "You have been [(muteunmute ? "muted" : "voiced")] from [mute_string] by the SPAM AUTOMUTE system. Contact an admin."
feedback_add_details("admin_verb","AUTOMUTE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_add_random_ai_law()
@@ -139,10 +204,10 @@
var/show_log = alert(src, "Show ion message?", "Message", "Yes", "No")
if(show_log == "Yes")
command_alert("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert")
world << sound('ionstorm.ogg')
world << sound('sound/AI/ionstorm.ogg')
//IonStorm(0)
//feedback_add_details("admin_verb","ION") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
IonStorm(0)
feedback_add_details("admin_verb","ION") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/*
Stealth spawns xenos
@@ -158,10 +223,10 @@
src << "Only administrators may use this command."
return
create_xeno()
//feedback_add_details("admin_verb","X") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] spawned a xeno.")
message_admins("\blue [key_name_admin(usr)] spawned a xeno.", 1)
if(create_xeno())
feedback_add_details("admin_verb","X") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] spawned a xeno.")
message_admins("\blue [key_name_admin(usr)] spawned a xeno.", 1)
return
//I use this proc for respawn character too. /N
@@ -173,40 +238,36 @@
var/mob/living/carbon/alien/humanoid/new_xeno
switch(alien_caste)
if("Hunter")
new_xeno = new /mob/living/carbon/alien/humanoid/hunter (spawn_here)
new_xeno = new /mob/living/carbon/alien/humanoid/hunter(spawn_here)
if("Sentinel")
new_xeno = new /mob/living/carbon/alien/humanoid/sentinel (spawn_here)
new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(spawn_here)
if("Drone")
new_xeno = new /mob/living/carbon/alien/humanoid/drone (spawn_here)
new_xeno = new /mob/living/carbon/alien/humanoid/drone(spawn_here)
else
return 0
// Picks a random ghost for the role if none is specified. Mostly a copy of alien burst code.
var/candidates_list[] = list()
if(G)//If G exists through a passed argument.
candidates_list += G.client
else//Else we need to find them.
for(G in world)
if(G.client)
if(!G.client.holder && ((G.client.inactivity/10)/60) <= 5)
candidates_list += G.client//We want their client, not their ghost.
if(candidates_list.len)//If there are people to spawn.
if(!G)//If G was not passed through an argument.
var/client/G_client = input("Pick the client you want to respawn as a xeno.", "Active Players") as null|anything in candidates_list//It will auto-pick a person when there is only one candidate.
if(G_client)//They may have logged out when the admin was choosing people. Or were not chosen. Would run time error otherwise.
G = G_client.mob
var/selected_key
if(G && G.key)
selected_key = G.key
else
var/list/candidates = list() //List of candidate KEYS to assume control of the new larva ~Carn
for(G in player_list)
if(G.client.be_alien)
if(((G.client.inactivity/10)/60) <= 5)
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
candidates += G.key
if(candidates.len)
selected_key = input("Pick the client you want to respawn as a xeno.", "Suitable Candidates") as null|anything in candidates
if(G)//If G exists.
message_admins("\blue [key_name_admin(usr)] has spawned [G.key] as a filthy xeno.", 1)
new_xeno.mind_initialize(G, alien_caste)
new_xeno.key = G.key
else//We won't be reporting duds.
del(new_xeno)
del(G)
return
alert("There are no available ghosts to throw into the xeno. Aborting command.")
del(new_xeno)
return
if(selected_key)
new_xeno.key = selected_key
message_admins("\blue [key_name_admin(usr)] has spawned [selected_key] as a filthy xeno.", 1)
return 1
else
//we couldn't find a candidate
usr << "<font color='red'>Error: create_xeno(): no suitable players.</font>"
del(new_xeno)
return 0
/*
If a guy was gibbed and you want to revive him, this is a good way to do so.
@@ -220,131 +281,95 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(!holder)
src << "Only administrators may use this command."
return
var/input = input(src, "Please specify which key will be respawned.", "Key", "")
var/input = ckey(input(src, "Please specify which key will be respawned.", "Key", ""))
if(!input)
return
var/mob/dead/observer/G_found
for(var/mob/dead/observer/G in world)
if(G.client&&ckey(G.key)==ckey(input))
for(var/mob/dead/observer/G in player_list)
if(G.ckey == input)
G_found = G
break
if(!G_found)//If a ghost was not found.
alert("There is no active key like that in the game or the person is not currently a ghost. Aborting command.")
usr << "<font color='red'>There is no active key like that in the game or the person is not currently a ghost.</font>"
return
//First we spawn a dude.
var/mob/living/carbon/human/new_character = new(src)//The mob being spawned.
if(G_found.mind && !G_found.mind.active) //mind isn't currently in use by someone/something
//Check if they were an alien
if(G_found.mind.assigned_role=="Alien")
if(alert("This character appears to have been an alien. Would you like to respawn them as such?",,"Yes","No")=="Yes")
var/turf/T
if(xeno_spawn.len) T = pick(xeno_spawn)
else T = pick(latejoin)
//Second, we check if they are an alien or monkey.
var/adj_name = copytext(G_found.real_name,1,7)//What is their name?
if(G_found.mind&&G_found.mind.special_role=="Alien")//If they have a mind, are they an alien?
adj_name="alien "
if( adj_name==("alien "||"monkey"))
if(alert("This character appears to either be an an alien or monkey. Would you like to respawn them as such?",,"Yes","No")=="Yes")//If you do.
switch(adj_name)//Let's check based on adjusted name.
if("monkey")//A monkey. Monkeys don't have a mind, so we can safely spawn them here if needed.
//TO DO: Monkeys may have a mind now. May need retooling.
var/mob/living/carbon/monkey/M = new(pick(latejoin))//Spawn a monkey at latejoin.
M.mind = G_found.mind
if(M.mind)//If the mind is not null.
M.mind.current = M
M.key = G_found.key//They are now a monkey. Nothing else needs doing.
if("alien ")//An alien. Aliens can have a mind which can be used to determine a few things.
if(G_found.mind)
var/turf/location = xeno_spawn.len ? pick(xeno_spawn) : pick(latejoin)//Location where they will be spawned.
var/mob/living/carbon/alien/new_xeno//Null alien mob first.
switch(G_found.mind.special_role)//If they have a mind, we can determine which caste they were.
if("Hunter")
new_xeno = new/mob/living/carbon/alien/humanoid/hunter(location)
if("Sentinel")
new_xeno = new/mob/living/carbon/alien/humanoid/sentinel(location)
if("Drone")
new_xeno = new/mob/living/carbon/alien/humanoid/drone(location)
if("Queen")
new_xeno = new/mob/living/carbon/alien/humanoid/queen(location)
else//If we don't know what special role they have, for whatever reason, or they're a larva.
create_xeno(G_found)
return
//Now to give them a new mind.
new_xeno.mind = new
new_xeno.mind.assigned_role = "Alien"
new_xeno.mind.special_role = G_found.mind.special_role
new_xeno.mind.key = G_found.key
new_xeno.mind.current = new_xeno
new_xeno.key = G_found.key
new_xeno << "You have been fully respawned. Enjoy the game."
message_admins("\blue [key_name_admin(usr)] has respawned [new_xeno.key] as a filthy xeno.", 1)
//And we're done. Announcing other stuff is handled by spawn_xeno.
else
create_xeno(G_found)//Else we default to the standard command for spawning a xenomorph.
var/mob/living/carbon/alien/new_xeno
switch(G_found.mind.special_role)//If they have a mind, we can determine which caste they were.
if("Hunter") new_xeno = new /mob/living/carbon/alien/humanoid/hunter(T)
if("Sentinel") new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(T)
if("Drone") new_xeno = new /mob/living/carbon/alien/humanoid/drone(T)
if("Queen") new_xeno = new /mob/living/carbon/alien/humanoid/queen(T)
else//If we don't know what special role they have, for whatever reason, or they're a larva.
create_xeno(G_found)
return
del(G_found)
return
//Monkeys aren't terribly important so we won't be announcing them. The proc basically ends here.
else//Or not.
G_found.mind=null//Null their mind so we don't screw things up ahead.
G_found.real_name="[pick(pick(first_names_male,first_names_female))] [pick(last_names)]"//Give them a random real name.
/*Third, we try and locate a record for the person being respawned through data_core.
This isn't an exact science but it does the trick more often than not.*/
var/datum/data/record/record_found//Referenced to later to either randomize or not randomize the character.
if(G_found.mind)//They must have a mind to reference the record. Here we also double check for aliens.
//Now to give them their mind back.
G_found.mind.transfer_to(new_xeno) //be careful when doing stuff like this! I've already checked the mind isn't in use
new_xeno.key = G_found.key
new_xeno << "You have been fully respawned. Enjoy the game."
message_admins("\blue [key_name_admin(usr)] has respawned [new_xeno.key] as a filthy xeno.", 1)
return //all done. The ghost is auto-deleted
//check if they were a monkey
else if(findtext(G_found.real_name,"monkey"))
if(alert("This character appears to have been a monkey. Would you like to respawn them as such?",,"Yes","No")=="Yes")
var/mob/living/carbon/monkey/new_monkey = new(pick(latejoin))
G_found.mind.transfer_to(new_monkey) //be careful when doing stuff like this! I've already checked the mind isn't in use
new_monkey.key = G_found.key
new_monkey << "You have been fully respawned. Enjoy the game."
message_admins("\blue [key_name_admin(usr)] has respawned [new_monkey.key] as a filthy xeno.", 1)
return //all done. The ghost is auto-deleted
//Ok, it's not a xeno or a monkey. So, spawn a human.
var/mob/living/carbon/human/new_character = new(pick(latejoin))//The mob being spawned.
var/datum/data/record/record_found //Referenced to later to either randomize or not randomize the character.
if(G_found.mind && !G_found.mind.active) //mind isn't currently in use by someone/something
/*Try and locate a record for the person being respawned through data_core.
This isn't an exact science but it does the trick more often than not.*/
var/id = md5("[G_found.real_name][G_found.mind.assigned_role]")
for(var/datum/data/record/t in data_core.locked)
if(t.fields["id"]==id)
record_found = t//We shall now reference the record.
break
//Now we do some mind locating to see how to set up the rest of the character.
if(G_found.mind)//If they had a previous mind.
new_character.mind = G_found.mind
new_character.mind.special_verbs = list()//New list because they will receive them again.
if(record_found)//If they have a record we can determine a few things.
new_character.real_name = record_found.fields["name"]
new_character.gender = record_found.fields["sex"]
new_character.age = record_found.fields["age"]
new_character.b_type = record_found.fields["b_type"]
else
new_character.mind = new()
ticker.minds += new_character.mind//And we'll add it to the minds database.
new_character.mind.original = new_character//If they are respawning with a new character.
if(!record_found)//We have to pick their role if they have no record.
if(G_found.mind&&G_found.mind.assigned_role)//But they may have an assigned role already.
new_character.mind.assigned_role = G_found.mind.assigned_role//Also makes sure our MODE people are equipped right later on.
new_character.mind.role_alt_title = G_found.mind.role_alt_title
else
var/assigned_role = input("Please specify which job the character will be respawned as.", "Assigned role") as null|anything in get_all_jobs()
if(!assigned_role) new_character.mind.assigned_role = "Assistant"//Defaults to assistant.
else new_character.mind.assigned_role = assigned_role
new_character.gender = pick(MALE,FEMALE)
var/datum/preferences/A = new()
A.randomize_appearance_for(new_character)
new_character.real_name = G_found.real_name
if(!new_character.real_name)
if(new_character.gender == MALE)
new_character.real_name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
else
new_character.real_name = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names))
new_character.name = new_character.real_name
if(G_found.mind && !G_found.mind.active)
G_found.mind.transfer_to(new_character) //be careful when doing stuff like this! I've already checked the mind isn't in use
new_character.mind.special_verbs = list()
else
new_character.mind_initialize()
if(!new_character.mind.assigned_role) new_character.mind.assigned_role = "Assistant"//If they somehow got a null assigned role.
new_character.mind.key = G_found.key//In case it's someone else playing as that character.
new_character.mind.current = new_character//So that it can properly reference later if needed.
new_character.mind.memory = ""//Memory erased so it doesn't get clunkered up with useless info. This means they may forget their previous mission--this is usually handled through objective code and recalling memory.
//Here we either load their saved appearance or randomize it.
var/datum/preferences/A = new()
if(A.savefile_load(G_found))//If they have a save file. This will automatically load their parameters.
//Note: savefile appearances are overwritten later on if the character has a data_core entry. By appearance, I mean the physical appearance.
var/name_safety = G_found.real_name//Their saved parameters may include a random name. Also a safety in case they are playing a character that got their name after round start.
A.copy_to(new_character)
new_character.real_name = name_safety
new_character.name = name_safety
else
if(record_found)//If they have a record we can determine a few things.
new_character.real_name = record_found.fields["name"]//Not necessary to reference the record but I like to keep things uniform.
new_character.name = record_found.fields["name"]
new_character.gender = record_found.fields["sex"]//Sex
new_character.age = record_found.fields["age"]//Age
new_character.dna.b_type = record_found.fields["b_type"]//Blood type
//We will update their appearance when determining DNA.
else
new_character.gender = MALE
if(alert("Save file not detected. Record data not detected. Please specify [G_found.real_name]'s gender.",,"Male","Female")=="Female")
new_character.gender = FEMALE
var/name_safety = G_found.real_name//Default is a random name so we want to save this.
A.randomize_appearance_for(new_character)//Now we will randomize their appearance since we have no way of knowing what they look/looked like.
new_character.real_name = name_safety
new_character.name = name_safety
//After everything above, it's time to initialize their DNA.
//DNA
if(record_found)//Pull up their name from database records if they did have a mind.
new_character.dna = new()//Let's first give them a new DNA.
new_character.dna.unique_enzymes = record_found.fields["b_dna"]//Enzymes are based on real name but we'll use the record for conformity.
@@ -354,10 +379,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
else//If they have no records, we just do a random DNA for them, based on their random appearance/savefile.
new_character.dna.ready_dna(new_character)
//Here we need to find where to spawn them.
var/spawn_here = pick(latejoin)//"JoinLate" is a landmark which is deleted on round start. So, latejoin has to be used instead.
new_character.loc = spawn_here
//If they need to spawn elsewhere, they will be transferred there momentarily.
new_character.key = G_found.key
/*
The code below functions with the assumption that the mob is already a traitor if they have a special role.
@@ -369,13 +391,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/admin = key_name_admin(src)
var/player_key = G_found.key
new_character.key = player_key//Throw them into the mob.
//Now for special roles and equipment.
switch(new_character.mind.special_role)
if("Changeling")
job_master.EquipRank(new_character, new_character.mind.assigned_role, 1)
new_character.make_changeling()
if("traitor")
job_master.EquipRank(new_character, new_character.mind.assigned_role, 1)
ticker.mode.equip_traitor(new_character)
@@ -422,7 +439,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(!record_found&&new_character.mind.assigned_role!="MODE")//If there are no records for them. If they have a record, this info is already in there. MODE people are not announced anyway.
//Power to the user!
if(alert(new_character,"Warning: No data core entry detected. Would you like to announce the arrival of this character by adding them to various databases, such as medical records?",,"No","Yes")=="Yes")
call(/mob/new_player/proc/ManifestLateSpawn)(new_character)
data_core.manifest_inject(new_character)
if(alert(new_character,"Would you like an active AI to announce this character?",,"No","Yes")=="Yes")
call(/mob/new_player/proc/AnnounceArrival)(new_character, new_character.mind.assigned_role)
@@ -431,8 +448,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
new_character << "You have been fully respawned. Enjoy the game."
del(G_found)//Don't want to leave ghosts around.
//feedback_add_details("admin_verb","RSPCH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","RSPCH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return new_character
/client/proc/cmd_admin_add_freeform_ai_law()
@@ -444,14 +460,14 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/input = input(usr, "Please enter anything you want the AI to do. Anything. Serious.", "What?", "") as text|null
if(!input)
return
for(var/mob/living/silicon/ai/M in world)
for(var/mob/living/silicon/ai/M in mob_list)
if (M.stat == 2)
usr << "Upload failed. No signal is being detected from the AI."
else if (M.see_in_dark == 0)
usr << "Upload failed. Only a faint signal is being detected from the AI, and it is not responding to our requests. It may be low on power."
else
M.add_ion_law(input)
for(var/mob/living/silicon/ai/O in world)
for(var/mob/living/silicon/ai/O in mob_list)
O << "\red " + input
log_admin("Admin [key_name(usr)] has added a new AI law - [input]")
@@ -460,10 +476,10 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/show_log = alert(src, "Show ion message?", "Message", "Yes", "No")
if(show_log == "Yes")
command_alert("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert")
world << sound('ionstorm.ogg')
//feedback_add_details("admin_verb","IONC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
world << sound('sound/AI/ionstorm.ogg')
feedback_add_details("admin_verb","IONC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_rejuvenate(mob/living/M as mob in world)
/client/proc/cmd_admin_rejuvenate(mob/living/M as mob in mob_list)
set category = "Special Verbs"
set name = "Rejuvenate"
if(!holder)
@@ -481,7 +497,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
message_admins("\red Admin [key_name_admin(usr)] healed / revived [key_name_admin(M)]!", 1)
else
alert("Admin revive disabled")
//feedback_add_details("admin_verb","REJU") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","REJU") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_create_centcom_report()
set category = "Special Verbs"
@@ -490,30 +506,33 @@ Traitors and the like can also be revived with the previous role mostly intact.
src << "Only administrators may use this command."
return
var/input = input(usr, "Please enter anything you want. Anything. Serious.", "What?", "") as message|null
var/customname = input(usr, "Pick a title for the report.", "Title") as text|null
if(!input)
return
if(!customname)
customname = "NanoTrasen Update"
for (var/obj/machinery/computer/communications/C in machines)
if(! (C.stat & (BROKEN|NOPOWER) ) )
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc )
P.name = "'[command_name()] Update.'"
P.info = input
P.update_icon()
C.messagetitle.Add("[command_name()] Update")
C.messagetext.Add(P.info)
switch(alert("Should this be announced to the general population?",,"Yes","No"))
if("Yes")
command_alert(input, maintitle=customname);
if("No")
world << "\red New NanoTrasen Update available at all communication consoles."
var/confirm = alert(src, "Do you want to announce the contents of the report to the crew?", "Announce", "Yes", "No")
if(confirm == "Yes")
command_alert(input);
for (var/obj/machinery/computer/communications/C in machines)
if(! (C.stat & (BROKEN|NOPOWER) ) )
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc )
P.name = "paper- '[command_name()] Update.'"
P.info = input
C.messagetitle.Add("[command_name()] Update")
C.messagetext.Add(P.info)
else
command_alert("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message");
for (var/obj/machinery/computer/communications/C in machines)
if(! (C.stat & (BROKEN|NOPOWER) ) )
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc )
P.name = "paper- 'Classified [command_name()] Update.'"
P.info = input
C.messagetitle.Add("Classified [command_name()] Update")
C.messagetext.Add(P.info)
world << sound('commandreport.ogg')
world << sound('sound/AI/commandreport.ogg')
log_admin("[key_name(src)] has created a command report: [input]")
message_admins("[key_name_admin(src)] has created a command report", 1)
//feedback_add_details("admin_verb","CCR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","CCR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in world)
set category = "Admin"
@@ -526,7 +545,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
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])", 1)
//feedback_add_details("admin_verb","DEL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","DEL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
del(O)
/client/proc/cmd_admin_list_open_jobs()
@@ -539,7 +558,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(job_master)
for(var/datum/job/job in job_master.occupations)
src << "[job.title]: [job.total_positions]"
//feedback_add_details("admin_verb","LFS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","LFS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in world)
set category = "Special Verbs"
@@ -563,10 +582,10 @@ Traitors and the like can also be revived with the previous role mostly intact.
if (alert(src, "Are you sure you want to do this? It will laaag.", "Confirmation", "Yes", "No") == "No")
return
explosion (O, devastation, heavy, light, flash)
explosion(O, devastation, heavy, light, flash)
log_admin("[key_name(usr)] created an explosion ([devastation],[heavy],[light],[flash]) at ([O.x],[O.y],[O.z])")
message_admins("[key_name_admin(usr)] created an explosion ([devastation],[heavy],[light],[flash]) at ([O.x],[O.y],[O.z])", 1)
//feedback_add_details("admin_verb","EXPL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","EXPL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
else
return
@@ -589,13 +608,13 @@ Traitors and the like can also be revived with the previous role mostly intact.
empulse(O, heavy, light)
log_admin("[key_name(usr)] created an EM Pulse ([heavy],[light]) at ([O.x],[O.y],[O.z])")
message_admins("[key_name_admin(usr)] created an EM PUlse ([heavy],[light]) at ([O.x],[O.y],[O.z])", 1)
//feedback_add_details("admin_verb","EMP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","EMP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
else
return
/client/proc/cmd_admin_gib(mob/M as mob in world)
/client/proc/cmd_admin_gib(mob/M as mob in mob_list)
set category = "Special Verbs"
set name = "Gib"
@@ -616,7 +635,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
return
M.gib()
//feedback_add_details("admin_verb","GIB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","GIB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_gib_self()
set name = "Gibself"
@@ -631,12 +650,12 @@ Traitors and the like can also be revived with the previous role mostly intact.
log_admin("[key_name(usr)] used gibself.")
message_admins("\blue [key_name_admin(usr)] used gibself.", 1)
//feedback_add_details("admin_verb","GIBS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","GIBS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/*
/client/proc/cmd_manual_ban()
set name = "Manual Ban"
set category = "Special Verbs"
if(!holder)
if(!authenticated || !holder)
src << "Only administrators may use this command."
return
var/mob/M = null
@@ -664,7 +683,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 << "\red<BIG><B>You have been banned by [usr.client.ckey].\nReason: [reason].</B></BIG>"
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/"
@@ -680,7 +698,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 << "\red<BIG><B>You have been banned by [usr.client.ckey].\nReason: [reason].</B></BIG>"
M << "\red This is a permanent ban."
M << "\red To try to resolve this matter head to http://ss13.donglabs.com/forum/"
@@ -696,36 +713,44 @@ Traitors and the like can also be revived with the previous role mostly intact.
// I will both remove their SVN access and permanently ban them from my servers.
return
/client/proc/cmd_admin_check_contents(mob/living/M as mob in world)
/client/proc/cmd_admin_check_contents(mob/living/M as mob in mob_list)
set category = "Special Verbs"
set name = "Check Contents"
var/list/L = M.get_contents()
for(var/t in L)
usr << "[t]"
//feedback_add_details("admin_verb","CC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","CC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/* This proc is DEFERRED. Does not do anything.
/client/proc/cmd_admin_remove_plasma(area/A as area)
/client/proc/cmd_admin_remove_plasma()
set category = "Debug"
set name = "Stabilize Atmos."
set desc = "Stabilize atmos in selected area."
if(!holder)
src << "Only administrators may use this command."
return
//feedback_add_details("admin_verb","STATM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
spawn(1)
for(var/turf/simulated/T in A)
if(T.air)
T.air.oxygen = T.oxygen
T.air.carbon_dioxide = T.carbon_dioxide
T.air.nitrogen = T.nitrogen
T.air.toxins = T.toxins
T.air.temperature = T.temperature
T.air.update_values()
// make things update properly
T.assume_air(new /datum/gas_mixture())
feedback_add_details("admin_verb","STATM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
// DEFERRED
spawn(0)
for(var/turf/T in view())
T.poison = 0
T.oldpoison = 0
T.tmppoison = 0
T.oxygen = 755985
T.oldoxy = 755985
T.tmpoxy = 755985
T.co2 = 14.8176
T.oldco2 = 14.8176
T.tmpco2 = 14.8176
T.n2 = 2.844e+006
T.on2 = 2.844e+006
T.tn2 = 2.844e+006
T.tsl_gas = 0
T.osl_gas = 0
T.sl_gas = 0
T.temp = 293.15
T.otemp = 293.15
T.ttemp = 293.15
*/
/client/proc/toggle_view_range()
@@ -741,7 +766,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
log_admin("[key_name(usr)] changed their view range to [view].")
//message_admins("\blue [key_name_admin(usr)] changed their view range to [view].", 1) //why? removed by order of XSI
//feedback_add_details("admin_verb","CVRA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","CVRA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/admin_call_shuttle()
@@ -767,8 +792,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
emergency_shuttle.incall()
captain_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.")
world << sound('shuttlecalled.ogg')
//feedback_add_details("admin_verb","CSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
world << sound('sound/AI/shuttlecalled.ogg')
feedback_add_details("admin_verb","CSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] admin-called the emergency shuttle.")
message_admins("\blue [key_name_admin(usr)] admin-called the emergency shuttle.", 1)
return
@@ -789,36 +814,20 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(confirm != "Yes") return
emergency_shuttle.recall()
//feedback_add_details("admin_verb","CCSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","CCSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] admin-recalled the emergency shuttle.")
message_admins("\blue [key_name_admin(usr)] admin-recalled the emergency shuttle.", 1)
return
/client/proc/admin_deny_shuttle()
set category = "Admin"
set name = "Toggle Deny Shuttle"
if (!ticker)
return
if (!holder)
src << "Only administrators may use this command."
return
emergency_shuttle.deny_shuttle = !emergency_shuttle.deny_shuttle
log_admin("[key_name(src)] has [emergency_shuttle.deny_shuttle ? "denied" : "allowed"] the shuttle to be called.")
message_admins("[key_name_admin(usr)] has [emergency_shuttle.deny_shuttle ? "denied" : "allowed"] the shuttle to be called.")
/client/proc/cmd_admin_attack_log(mob/M as mob in world)
/client/proc/cmd_admin_attack_log(mob/M as mob in mob_list)
set category = "Special Verbs"
set name = "Attack Log"
usr << text("\red <b>Attack Log for []</b>", mob)
for(var/t in M.attack_log)
usr << t
//feedback_add_details("admin_verb","ATTL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","ATTL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/everyone_random()
@@ -850,7 +859,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
usr << "<i>Remember: you can always disable the randomness by using the verb again, assuming the round hasn't started yet</i>."
ticker.random_players = 1
//feedback_add_details("admin_verb","MER") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","MER") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/toggle_gravity_on()
set category = "Debug"
@@ -865,8 +874,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
for(var/area/A in world)
A.gravitychange(1,A)
command_alert("CentComm is now beaming gravitons to your station. We apologize for any inconvience.")
//feedback_add_details("admin_verb","TSGON") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
command_alert("CentComm is now beaming gravitons to your station. We appoligize for any inconvience.")
feedback_add_details("admin_verb","TSGON") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/toggle_gravity_off()
set category = "Debug"
@@ -881,8 +890,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
for(var/area/A in world)
A.gravitychange(0,A)
command_alert("For budget reasons, Centcomm is no longer beaming gravitons to your station. We apologize for any inconvience.")
//feedback_add_details("admin_verb","TSGOFF") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
command_alert("For budget reasons, Centcomm is no longer beaming gravitons to your station. We appoligize for any inconvience.")
feedback_add_details("admin_verb","TSGOFF") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/toggle_random_events()
@@ -897,33 +906,4 @@ Traitors and the like can also be revived with the previous role mostly intact.
config.allow_random_events = 0
usr << "Random events disabled"
message_admins("Admin [key_name_admin(usr)] has disabled random events.", 1)
//feedback_add_details("admin_verb","TRE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/rnd_check_designs()
set category = "Debug"
set name = "Check RnD Designs"
set desc = "Check validity of RnD data of the consoles and server."
if (!holder)
src << "Only administrators may use this command."
return
var/dat = "<head><title>RnD Check</title></head>"
for(var/obj/machinery/computer/rdconsole/C in world)
dat += "<b>[C.name] - RnD Console</b><br>"
for(var/datum/design/D in C.files.known_designs)
if(!text2path(D.build_path))
dat += "[D.name]'s has invalid build path [D.build_path]<br>"
dat += "<br>"
for(var/obj/machinery/r_n_d/server/C in world)
dat += "<b>[C.name] - Server</b><br>"
for(var/datum/design/D in C.files.known_designs)
if(!text2path(D.build_path))
dat += "[D.name]'s has invalid build path [D.build_path]<br>"
dat += "<br>"
dat += "<hr><a href='?src=\ref[holder];rnd_max=1'>Max out tech levels.</a>"
usr << browse(dat, "window=chk_design")
feedback_add_details("admin_verb","TRE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+44 -58
View File
@@ -51,36 +51,30 @@ var/global/sent_strike_team = 0
break
//Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos.
var/mob/dead/observer/G//Basic variable to search for later.
var/candidates_list[] = list()//candidates for being a commando out of all the active ghosts in world.
var/commandos_list[] = list()//actual commando ghosts as picked by the user.
for(G in world)
if(G.client)
if(!G.client.holder && ((G.client.inactivity/10)/60) <= 5) //Whoever called/has the proc won't be added to the list.
// if(((G.client.inactivity/10)/60) <= 5) //Removing it allows even the caller to jump in. Good for testing.
candidates_list += G.client//Add their client to list.
for(var/i=commandos_possible,(i>0&&candidates_list.len),i--)//Decrease with every commando selected.
var/client/G_client = input("Pick characters to spawn as the commandos. This will go on until there either no more ghosts to pick from or the slots are full.", "Active Players") as null|anything in candidates_list//It will auto-pick a person when there is only one candidate.
if(G_client)//They may have logged out when the admin was choosing people. Or were not chosen. Would run time error otherwise.
candidates_list -= G_client//Subtract from candidates.
commandos_list += G_client.mob//Add their ghost to commandos.
var/list/candidates = list() //candidates for being a commando out of all the active ghosts in world.
var/list/commandos = list() //actual commando ghosts as picked by the user.
for(var/mob/dead/observer/G in player_list)
if(!G.client.holder && ((G.client.inactivity/10)/60) <= 5) //Whoever called/has the proc won't be added to the list.
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
candidates += G.key
for(var/i=commandos_possible,(i>0&&candidates.len),i--)//Decrease with every commando selected.
var/candidate = input("Pick characters to spawn as the commandos. This will go on until there either no more ghosts to pick from or the slots are full.", "Active Players") as null|anything in candidates //It will auto-pick a person when there is only one candidate.
candidates -= candidate //Subtract from candidates.
commandos += candidate//Add their ghost to commandos.
//Spawns commandos and equips them.
for (var/obj/effect/landmark/L in world)
for(var/obj/effect/landmark/L in world)
if(commando_number<=0) break
if (L.name == "Commando")
leader_selected = commando_number == 1?1:0
var/mob/living/carbon/human/new_commando = create_death_commando(L, leader_selected)
if(commandos_list.len)
G = pick(commandos_list)
new_commando.mind.key = G.key//For mind stuff.
new_commando.key = G.key
if(commandos.len)
new_commando.key = pick(commandos)
commandos -= new_commando.key
new_commando.internal = new_commando.s_store
new_commando.internals.icon_state = "internal1"
commandos_list -= G
del(G)
//So they don't forget their code or mission.
if(nuke_code)
@@ -96,7 +90,7 @@ var/global/sent_strike_team = 0
if (L.name == "Commando_Manual")
//new /obj/item/weapon/gun/energy/pulse_rifle(L.loc)
var/obj/item/weapon/paper/P = new(L.loc)
P.info = "<p><b>Good morning soldier!</b>. This compact guide will familiarize you with standard operating procedure. There are three basic rules to follow:<br>#1 Work as a team.<br>#2 Accomplish your objective at all costs.<br>#3 Leave no witnesses.<br>You are fully equipped and stocked for your mission--before departing on the Spec. Ops. Shuttle due South, make sure that all operatives are ready. Actual mission objective will be relayed to you by Central Command through your headsets.<br>If deemed appropriate, Central Command will also allow members of your team to equip assault power-armor for the mission. You will find the armor storage due West of your position. Once you are ready to leave, utilize the Special Operations shuttle console and toggle the hull doors via the other console.</p><p>In the event that the team does not accomplish their assigned objective in a timely manner, or finds no other way to do so, attached below are instructions on how to operate a NanoTrasen Nuclear Device. Your operations <b>LEADER</b> is provided with a nuclear authentication disk and a pin-pointer for this reason. You may easily recognize them by their rank: Lieutenant, Captain, or Major. The nuclear device itself will be present somewhere on your destination.</p><p>Hello and thank you for choosing NanoTrasen for your nuclear information needs. Today's crash course will deal with the operation of a Fission Class NanoTrasen made Nuclear Device.<br>First and foremost, <b>DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE.</b> Pressing any button on the compacted bomb will cause it to extend and bolt itself into place. If this is done to unbolt it one must completely log in which at this time may not be possible.<br>To make the device functional:<br>#1 Place bomb in designated detonation zone<br> #2 Extend and anchor bomb (attack with hand).<br>#3 Insert Nuclear Auth. Disk into slot.<br>#4 Type numeric code into keypad ([nuke_code]).<br>Note: If you make a mistake press R to reset the device.<br>#5 Press the E button to log onto the device.<br>You now have activated the device. To deactivate the buttons at anytime, for example when you have already prepped the bomb for detonation, remove the authentication disk OR press the R on the keypad. Now the bomb CAN ONLY be detonated using the timer. A manual detonation is not an option.<br>Note: Toggle off the <b>SAFETY</b>.<br>Use the - - and + + to set a detonation time between 5 seconds and 10 minutes. Then press the timer toggle button to start the countdown. Now remove the authentication disk so that the buttons deactivate.<br>Note: <b>THE BOMB IS STILL SET AND WILL DETONATE</b><br>Now before you remove the disk if you need to move the bomb you can: Toggle off the anchor, move it, and re-anchor.</p><p>The nuclear authorization code is: <b>[nuke_code ? nuke_code : "None provided"]</b></p><p><b>Good luck, soldier!</b></p>"
P.info = "<p><b>Good morning soldier!</b>. This compact guide will familiarize you with standard operating procedure. There are three basic rules to follow:<br>#1 Work as a team.<br>#2 Accomplish your objective at all costs.<br>#3 Leave no witnesses.<br>You are fully equipped and stocked for your mission--before departing on the Spec. Ops. Shuttle due South, make sure that all operatives are ready. Actual mission objective will be relayed to you by Central Command through your headsets.<br>If deemed appropriate, Central Command will also allow members of your team to equip assault power-armor for the mission. You will find the armor storage due West of your position. Once you are ready to leave, utilize the Special Operations shuttle console and toggle the hull doors via the other console.</p><p>In the event that the team does not accomplish their assigned objective in a timely manner, or finds no other way to do so, attached below are instructions on how to operate a Nanotrasen Nuclear Device. Your operations <b>LEADER</b> is provided with a nuclear authentication disk and a pin-pointer for this reason. You may easily recognize them by their rank: Lieutenant, Captain, or Major. The nuclear device itself will be present somewhere on your destination.</p><p>Hello and thank you for choosing Nanotrasen for your nuclear information needs. Today's crash course will deal with the operation of a Fission Class Nanotrasen made Nuclear Device.<br>First and foremost, <b>DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE.</b> Pressing any button on the compacted bomb will cause it to extend and bolt itself into place. If this is done to unbolt it one must completely log in which at this time may not be possible.<br>To make the device functional:<br>#1 Place bomb in designated detonation zone<br> #2 Extend and anchor bomb (attack with hand).<br>#3 Insert Nuclear Auth. Disk into slot.<br>#4 Type numeric code into keypad ([nuke_code]).<br>Note: If you make a mistake press R to reset the device.<br>#5 Press the E button to log onto the device.<br>You now have activated the device. To deactivate the buttons at anytime, for example when you have already prepped the bomb for detonation, remove the authentication disk OR press the R on the keypad. Now the bomb CAN ONLY be detonated using the timer. A manual detonation is not an option.<br>Note: Toggle off the <b>SAFETY</b>.<br>Use the - - and + + to set a detonation time between 5 seconds and 10 minutes. Then press the timer toggle button to start the countdown. Now remove the authentication disk so that the buttons deactivate.<br>Note: <b>THE BOMB IS STILL SET AND WILL DETONATE</b><br>Now before you remove the disk if you need to move the bomb you can: Toggle off the anchor, move it, and re-anchor.</p><p>The nuclear authorization code is: <b>[nuke_code ? nuke_code : "None provided"]</b></p><p><b>Good luck, soldier!</b></p>"
P.name = "Spec. Ops. Manual"
for (var/obj/effect/landmark/L in world)
@@ -106,7 +100,7 @@ var/global/sent_strike_team = 0
message_admins("\blue [key_name_admin(usr)] has spawned a CentCom strike squad.", 1)
log_admin("[key_name(usr)] used Spawn Death Squad.")
//feedback_add_details("admin_verb","DTHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","DTHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/create_death_commando(obj/spawn_location, leader_selected = 0)
var/mob/living/carbon/human/new_commando = new(spawn_location.loc)
@@ -125,17 +119,11 @@ var/global/sent_strike_team = 0
new_commando.dna.ready_dna(new_commando)//Creates DNA.
//Creates mind stuff.
new_commando.mind = new
new_commando.mind.current = new_commando
new_commando.mind.original = new_commando
new_commando.mind_initialize()
new_commando.mind.assigned_role = "MODE"
new_commando.mind.special_role = "Death Commando"
if(!(new_commando.mind in ticker.minds))
ticker.minds += new_commando.mind//Adds them to regular mind list.
if(!(new_commando.mind in ticker.mode.traitors))//If they weren't already an extra traitor.
ticker.mode.traitors += new_commando.mind//Adds them to current traitor list. Which is really the extra antagonist list.
ticker.mode.traitors |= new_commando.mind//Adds them to current traitor list. Which is really the extra antagonist list.
new_commando.equip_death_commando(leader_selected)
// del(spawn_location)
return new_commando
/mob/living/carbon/human/proc/equip_death_commando(leader_selected = 0)
@@ -145,42 +133,40 @@ var/global/sent_strike_team = 0
var/obj/item/device/radio/R = new /obj/item/device/radio/headset(src)
R.set_frequency(1441)
equip_if_possible(R, slot_ears)
equip_to_slot_or_del(R, slot_ears)
if (leader_selected == 0)
equip_if_possible(new /obj/item/clothing/under/color/green(src), slot_w_uniform)
equip_to_slot_or_del(new /obj/item/clothing/under/color/green(src), slot_w_uniform)
else
equip_if_possible(new /obj/item/clothing/under/rank/centcom_officer(src), slot_w_uniform)
equip_if_possible(new /obj/item/clothing/shoes/swat(src), slot_shoes)
equip_if_possible(new /obj/item/clothing/suit/armor/swat(src), slot_wear_suit)
equip_if_possible(new /obj/item/clothing/gloves/swat(src), slot_gloves)
equip_if_possible(new /obj/item/clothing/head/helmet/space/deathsquad(src), slot_head)
equip_if_possible(new /obj/item/clothing/mask/gas/swat(src), slot_wear_mask)
equip_if_possible(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(src), slot_w_uniform)
equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(src), slot_shoes)
equip_to_slot_or_del(new /obj/item/clothing/suit/armor/swat(src), slot_wear_suit)
equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(src), slot_gloves)
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad(src), slot_head)
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/swat(src), slot_wear_mask)
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
equip_if_possible(new /obj/item/weapon/storage/backpack/security(src), slot_back)
equip_if_possible(new /obj/item/weapon/storage/box(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(src), slot_back)
equip_to_slot_or_del(new /obj/item/weapon/storage/box(src), slot_in_backpack)
equip_if_possible(new /obj/item/ammo_magazine/a357(src), slot_in_backpack)
equip_if_possible(new /obj/item/weapon/storage/firstaid/adv(src), slot_in_backpack)
equip_if_possible(new /obj/item/weapon/storage/flashbang_kit(src), slot_in_backpack)
equip_if_possible(new /obj/item/device/flashlight(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/ammo_magazine/a357(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/storage/flashbang_kit(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_in_backpack)
if (!leader_selected)
equip_if_possible(new /obj/item/weapon/plastique(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/plastique(src), slot_in_backpack)
else
equip_if_possible(new /obj/item/weapon/pinpointer(src), slot_in_backpack)
equip_if_possible(new /obj/item/weapon/disk/nuclear(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/pinpointer(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/disk/nuclear(src), slot_in_backpack)
equip_if_possible(new /obj/item/weapon/melee/energy/sword(src), slot_l_store)
equip_if_possible(new /obj/item/weapon/flashbang(src), slot_r_store)
equip_if_possible(new /obj/item/weapon/tank/emergency_oxygen(src), slot_s_store)
equip_if_possible(new /obj/item/weapon/gun/projectile/mateba(src), slot_belt)
equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword(src), slot_l_store)
equip_to_slot_or_del(new /obj/item/weapon/grenade/flashbang(src), slot_r_store)
equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen(src), slot_s_store)
equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/mateba(src), slot_belt)
equip_if_possible(new /obj/item/weapon/gun/energy/pulse_rifle(src), slot_r_hand)
equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle(src), slot_r_hand)
var/datum/organ/external/O = src.organs[pick(src.organs)]
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(O)
O.implant += L
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(src)//Here you go Deuryn
L.imp_in = src
L.implanted = 1
@@ -190,10 +176,10 @@ var/global/sent_strike_team = 0
W.name = "[real_name]'s ID Card"
W.icon_state = "centcom"
W.access = get_all_accesses()//They get full station access.
W.access += list(ACCESS_CENT_GENERAL, ACCESS_CENT_SPECOPS, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE)//Let's add their alloted CentCom access.
W.access += list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage)//Let's add their alloted CentCom access.
W.assignment = "Death Commando"
W.registered_name = real_name
equip_if_possible(W, slot_wear_id)
equip_to_slot_or_del(W, slot_wear_id)
resistances += "alien_embryo"
return 1
@@ -51,36 +51,30 @@ var/global/sent_syndicate_strike_team = 0
break
//Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos.
var/mob/dead/observer/G//Basic variable to search for later.
var/candidates_list[] = list()//candidates for being a commando out of all the active ghosts in world.
var/syndicate_commandos_list[] = list()//actual commando ghosts as picked by the user.
for(G in world)
if(G.client)
if(!G.client.holder && ((G.client.inactivity/10)/60) <= 5) //Whoever called/has the proc won't be added to the list.
// if(((G.client.inactivity/10)/60) <= 5) //Removing it allows even the caller to jump in. Good for testing.
candidates_list += G.client//Add their client to list.
for(var/i=syndicate_commandos_possible,(i>0&&candidates_list.len),i--)//Decrease with every commando selected.
var/client/G_client = input("Pick characters to spawn as the commandos. This will go on until there either no more ghosts to pick from or the slots are full.", "Active Players") as null|anything in candidates_list//It will auto-pick a person when there is only one candidate.
if(G_client)//They may have logged out when the admin was choosing people. Or were not chosen. Would run time error otherwise.
candidates_list -= G_client//Subtract from candidates.
syndicate_commandos_list += G_client.mob//Add their ghost to commandos.
var/list/candidates = list() //candidates for being a commando out of all the active ghosts in world.
var/list/commandos = list() //actual commando ghosts as picked by the user.
for(var/mob/dead/observer/G in player_list)
if(!G.client.holder && ((G.client.inactivity/10)/60) <= 5) //Whoever called/has the proc won't be added to the list.
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
candidates += G.key
for(var/i=commandos_possible,(i>0&&candidates.len),i--)//Decrease with every commando selected.
var/candidate = input("Pick characters to spawn as the commandos. This will go on until there either no more ghosts to pick from or the slots are full.", "Active Players") as null|anything in candidates //It will auto-pick a person when there is only one candidate.
candidates -= candidate //Subtract from candidates.
commandos += candidate//Add their ghost to commandos.
//Spawns commandos and equips them.
for (var/obj/effect/landmark/L in world)
for(var/obj/effect/landmark/L in world)
if(syndicate_commando_number<=0) break
if (L.name == "Syndicate-Commando")
syndicate_leader_selected = syndicate_commando_number == 1?1:0
var/mob/living/carbon/human/new_syndicate_commando = create_syndicate_death_commando(L, syndicate_leader_selected)
if(syndicate_commandos_list.len)
G = pick(syndicate_commandos_list)
new_syndicate_commando.mind.key = G.key//For mind stuff.
new_syndicate_commando.key = G.key
if(commandos.len)
new_syndicate_commando.key = pick(commandos)
commandos -= new_syndicate_commando.key
new_syndicate_commando.internal = new_syndicate_commando.s_store
new_syndicate_commando.internals.icon_state = "internal1"
syndicate_commandos_list -= G
del(G)
//So they don't forget their code or mission.
if(nuke_code)
@@ -96,7 +90,7 @@ var/global/sent_syndicate_strike_team = 0
// if (L.name == "Commando_Manual")
//new /obj/item/weapon/gun/energy/pulse_rifle(L.loc)
// var/obj/item/weapon/paper/P = new(L.loc)
// P.info = "<p><b>Good morning soldier!</b>. This compact guide will familiarize you with standard operating procedure. There are three basic rules to follow:<br>#1 Work as a team.<br>#2 Accomplish your objective at all costs.<br>#3 Leave no witnesses.<br>You are fully equipped and stocked for your mission--before departing on the Spec. Ops. Shuttle due South, make sure that all operatives are ready. Actual mission objective will be relayed to you by Central Command through your headsets.<br>If deemed appropriate, Central Command will also allow members of your team to equip assault power-armor for the mission. You will find the armor storage due West of your position. Once you are ready to leave, utilize the Special Operations shuttle console and toggle the hull doors via the other console.</p><p>In the event that the team does not accomplish their assigned objective in a timely manner, or finds no other way to do so, attached below are instructions on how to operate a NanoTrasen Nuclear Device. Your operations <b>LEADER</b> is provided with a nuclear authentication disk and a pin-pointer for this reason. You may easily recognize them by their rank: Lieutenant, Captain, or Major. The nuclear device itself will be present somewhere on your destination.</p><p>Hello and thank you for choosing NanoTrasen for your nuclear information needs. Today's crash course will deal with the operation of a Fission Class NanoTrasen made Nuclear Device.<br>First and foremost, <b>DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE.</b> Pressing any button on the compacted bomb will cause it to extend and bolt itself into place. If this is done to unbolt it one must completely log in which at this time may not be possible.<br>To make the device functional:<br>#1 Place bomb in designated detonation zone<br> #2 Extend and anchor bomb (attack with hand).<br>#3 Insert Nuclear Auth. Disk into slot.<br>#4 Type numeric code into keypad ([nuke_code]).<br>Note: If you make a mistake press R to reset the device.<br>#5 Press the E button to log onto the device.<br>You now have activated the device. To deactivate the buttons at anytime, for example when you have already prepped the bomb for detonation, remove the authentication disk OR press the R on the keypad. Now the bomb CAN ONLY be detonated using the timer. A manual detonation is not an option.<br>Note: Toggle off the <b>SAFETY</b>.<br>Use the - - and + + to set a detonation time between 5 seconds and 10 minutes. Then press the timer toggle button to start the countdown. Now remove the authentication disk so that the buttons deactivate.<br>Note: <b>THE BOMB IS STILL SET AND WILL DETONATE</b><br>Now before you remove the disk if you need to move the bomb you can: Toggle off the anchor, move it, and re-anchor.</p><p>The nuclear authorization code is: <b>[nuke_code ? nuke_code : "None provided"]</b></p><p><b>Good luck, soldier!</b></p>"
// P.info = "<p><b>Good morning soldier!</b>. This compact guide will familiarize you with standard operating procedure. There are three basic rules to follow:<br>#1 Work as a team.<br>#2 Accomplish your objective at all costs.<br>#3 Leave no witnesses.<br>You are fully equipped and stocked for your mission--before departing on the Spec. Ops. Shuttle due South, make sure that all operatives are ready. Actual mission objective will be relayed to you by Central Command through your headsets.<br>If deemed appropriate, Central Command will also allow members of your team to equip assault power-armor for the mission. You will find the armor storage due West of your position. Once you are ready to leave, utilize the Special Operations shuttle console and toggle the hull doors via the other console.</p><p>In the event that the team does not accomplish their assigned objective in a timely manner, or finds no other way to do so, attached below are instructions on how to operate a Nanotrasen Nuclear Device. Your operations <b>LEADER</b> is provided with a nuclear authentication disk and a pin-pointer for this reason. You may easily recognize them by their rank: Lieutenant, Captain, or Major. The nuclear device itself will be present somewhere on your destination.</p><p>Hello and thank you for choosing Nanotrasen for your nuclear information needs. Today's crash course will deal with the operation of a Fission Class Nanotrasen made Nuclear Device.<br>First and foremost, <b>DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE.</b> Pressing any button on the compacted bomb will cause it to extend and bolt itself into place. If this is done to unbolt it one must completely log in which at this time may not be possible.<br>To make the device functional:<br>#1 Place bomb in designated detonation zone<br> #2 Extend and anchor bomb (attack with hand).<br>#3 Insert Nuclear Auth. Disk into slot.<br>#4 Type numeric code into keypad ([nuke_code]).<br>Note: If you make a mistake press R to reset the device.<br>#5 Press the E button to log onto the device.<br>You now have activated the device. To deactivate the buttons at anytime, for example when you have already prepped the bomb for detonation, remove the authentication disk OR press the R on the keypad. Now the bomb CAN ONLY be detonated using the timer. A manual detonation is not an option.<br>Note: Toggle off the <b>SAFETY</b>.<br>Use the - - and + + to set a detonation time between 5 seconds and 10 minutes. Then press the timer toggle button to start the countdown. Now remove the authentication disk so that the buttons deactivate.<br>Note: <b>THE BOMB IS STILL SET AND WILL DETONATE</b><br>Now before you remove the disk if you need to move the bomb you can: Toggle off the anchor, move it, and re-anchor.</p><p>The nuclear authorization code is: <b>[nuke_code ? nuke_code : "None provided"]</b></p><p><b>Good luck, soldier!</b></p>"
// P.name = "Spec. Ops. Manual"
for (var/obj/effect/landmark/L in world)
@@ -106,7 +100,7 @@ var/global/sent_syndicate_strike_team = 0
message_admins("\blue [key_name_admin(usr)] has spawned a Syndicate strike squad.", 1)
log_admin("[key_name(usr)] used Spawn Syndicate Squad.")
//feedback_add_details("admin_verb","SDTHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
feedback_add_details("admin_verb","SDTHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/create_syndicate_death_commando(obj/spawn_location, syndicate_leader_selected = 0)
var/mob/living/carbon/human/new_syndicate_commando = new(spawn_location.loc)
@@ -125,15 +119,10 @@ var/global/sent_syndicate_strike_team = 0
new_syndicate_commando.dna.ready_dna(new_syndicate_commando)//Creates DNA.
//Creates mind stuff.
new_syndicate_commando.mind = new
new_syndicate_commando.mind.current = new_syndicate_commando
new_syndicate_commando.mind.original = new_syndicate_commando
new_syndicate_commando.mind_initialize()
new_syndicate_commando.mind.assigned_role = "MODE"
new_syndicate_commando.mind.special_role = "Syndicate Commando"
if(!(new_syndicate_commando.mind in ticker.minds))
ticker.minds += new_syndicate_commando.mind//Adds them to regular mind list.
if(!(new_syndicate_commando.mind in ticker.mode.traitors))//If they weren't already an extra traitor.
ticker.mode.traitors += new_syndicate_commando.mind//Adds them to current traitor list. Which is really the extra antagonist list.
ticker.mode.traitors |= new_syndicate_commando.mind //Adds them to current traitor list. Which is really the extra antagonist list.
new_syndicate_commando.equip_syndicate_commando(syndicate_leader_selected)
del(spawn_location)
return new_syndicate_commando
@@ -143,51 +132,51 @@ var/global/sent_syndicate_strike_team = 0
camera.network = "Syndicate"
camera.c_tag = real_name
var/obj/item/device/radio/R = new /obj/item/device/radio/headset(src)
R.set_frequency(NUKE_FREQ) //Same frequency as the syndicate team in Nuke mode. DMTG
equip_if_possible(R, slot_ears)
equip_if_possible(new /obj/item/clothing/under/syndicate(src), slot_w_uniform)
equip_if_possible(new /obj/item/clothing/shoes/swat(src), slot_shoes)
var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate(src)
R.set_frequency(SYND_FREQ) //Same frequency as the syndicate team in Nuke mode.
equip_to_slot_or_del(R, slot_ears)
equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(src), slot_w_uniform)
equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(src), slot_shoes)
if (!syndicate_leader_selected)
equip_if_possible(new /obj/item/clothing/suit/space/syndicate/elite(src), slot_wear_suit)
equip_to_slot_or_del(new /obj/item/clothing/suit/space/syndicate/black(src), slot_wear_suit)
else
equip_if_possible(new /obj/item/clothing/suit/space/syndicate/elite/leader(src), slot_wear_suit)
equip_if_possible(new /obj/item/clothing/gloves/swat(src), slot_gloves)
equip_to_slot_or_del(new /obj/item/clothing/suit/space/syndicate/black/red(src), slot_wear_suit)
equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(src), slot_gloves)
if (!syndicate_leader_selected)
equip_if_possible(new /obj/item/clothing/head/helmet/space/syndicate/elite(src), slot_head)
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/syndicate/black(src), slot_head)
else
equip_if_possible(new /obj/item/clothing/head/helmet/space/syndicate/elite/leader(src), slot_head)
equip_if_possible(new /obj/item/clothing/mask/gas/syndicate(src), slot_wear_mask)
equip_if_possible(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/syndicate/black/red(src), slot_head)
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(src), slot_wear_mask)
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
equip_if_possible(new /obj/item/weapon/storage/backpack/security(src), slot_back)
equip_if_possible(new /obj/item/weapon/storage/box(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(src), slot_back)
equip_to_slot_or_del(new /obj/item/weapon/storage/box(src), slot_in_backpack)
equip_if_possible(new /obj/item/ammo_magazine/c45(src), slot_in_backpack)
equip_if_possible(new /obj/item/weapon/storage/firstaid/adv(src), slot_in_backpack)
equip_if_possible(new /obj/item/weapon/plastique(src), slot_in_backpack)
equip_if_possible(new /obj/item/device/flashlight(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/ammo_magazine/c45(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/plastique(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_in_backpack)
if (!syndicate_leader_selected)
equip_if_possible(new /obj/item/weapon/plastique(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/plastique(src), slot_in_backpack)
else
equip_if_possible(new /obj/item/weapon/pinpointer(src), slot_in_backpack)
equip_if_possible(new /obj/item/weapon/disk/nuclear(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/pinpointer(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/disk/nuclear(src), slot_in_backpack)
equip_if_possible(new /obj/item/weapon/melee/energy/sword(src), slot_l_store)
equip_if_possible(new /obj/item/weapon/empgrenade(src), slot_r_store)
equip_if_possible(new /obj/item/weapon/tank/emergency_oxygen(src), slot_s_store)
equip_if_possible(new /obj/item/weapon/gun/projectile/silenced(src), slot_belt)
equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword(src), slot_l_store)
equip_to_slot_or_del(new /obj/item/weapon/grenade/empgrenade(src), slot_r_store)
equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen(src), slot_s_store)
equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/silenced(src), slot_belt)
equip_if_possible(new /obj/item/weapon/gun/energy/pulse_rifle(src), slot_r_hand) //Will change to something different at a later time -- Superxpdude
equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle(src), slot_r_hand) //Will change to something different at a later time -- Superxpdude
var/obj/item/weapon/card/id/syndicate/W = new(src) //Untrackable by AI
W.name = "[real_name]'s ID Card"
W.icon_state = "id"
W.access = get_all_accesses()//They get full station access because obviously the syndicate has HAAAX, and can make special IDs for their most elite members.
W.access += list(ACCESS_CENT_GENERAL, ACCESS_CENT_SPECOPS, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE, ACCESS_SYNDICATE)//Let's add their forged CentCom access and syndicate access.
W.access += list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage, access_syndicate)//Let's add their forged CentCom access and syndicate access.
W.assignment = "Syndicate Commando"
W.registered_name = real_name
equip_if_possible(W, slot_wear_id)
equip_to_slot_or_del(W, slot_wear_id)
resistances += "alien_embryo"
return 1
+5 -5
View File
@@ -5,18 +5,18 @@
if(ticker.current_state > GAME_STATE_PREGAME)
usr << "This option is currently only usable during pregame. This may change at a later date."
return
if(job_master)
if(job_master && ticker)
var/datum/job/job = job_master.GetJob("AI")
if(!job)
usr << "Unable to locate the AI job"
return
if(job.spawn_positions >= 3)
job.spawn_positions -= 2
if(ticker.triai)
ticker.triai = 0
usr << "Only one AI will be spawned at round start."
message_admins("\blue [key_name_admin(usr)] has toggled off triple AIs at round start.", 1)
else
job.spawn_positions += 2
ticker.triai = 1
usr << "There will be an AI Triumvirate at round start."
message_admins("\blue [key_name_admin(usr)] has toggled on triple AIs at round start.", 1)
feedback_add_details("admin_verb","CAIT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return