From 78e89b7a0ab34286cc0b90a409473d8523c5a1f7 Mon Sep 17 00:00:00 2001 From: nervere <26285377+nervere@users.noreply.github.com> Date: Sun, 3 Dec 2023 01:18:45 +0000 Subject: [PATCH] customizable turrets for admins + button to spawn in Fun Secrets (#35462) * customizable turrets for admins + button to spawn in Fun Secrets * fix special description * clarity on admin menu --------- Co-authored-by: nervere --- code/game/machinery/turrets.dm | 72 ++++++++++++++++++++++++++++++++-- code/modules/admin/admin.dm | 1 + code/modules/admin/topic.dm | 7 ++++ 3 files changed, 76 insertions(+), 4 deletions(-) diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm index 4d906e618e8..e87494e4aa5 100644 --- a/code/game/machinery/turrets.dm +++ b/code/game/machinery/turrets.dm @@ -577,7 +577,8 @@ icon_state = "turretid_safe" /obj/structure/turret/gun_turret - name = "Gun Turret" + name = "gun turret" + desc = "A break-away from traditional design, this turret always has its hulking gun exposed. It looks menacing." density = 1 anchored = 1 var/cooldown = 20 @@ -587,12 +588,19 @@ var/list/exclude = list() var/atom/cur_target var/scan_range = 7 + var/projectile_type = /obj/item/projectile + var/firing_delay = 2 + var/admin_only = 0 //Can non-admins interface with this turret's controls? health = 40 var/list/scan_for = list("human"=0,"cyborg"=0,"mecha"=0,"alien"=1) var/on = 0 icon = 'icons/obj/turrets.dmi' icon_state = "gun_turret" +/obj/structure/turret/gun_turret/examine(mob/user) + ..() + if(admin_only) + to_chat(user, "This turret's control panel is glowing red and appears to be remotely locked down.") /obj/structure/turret/gun_turret/ex_act() qdel (src) @@ -612,9 +620,12 @@ return ..() /obj/structure/turret/gun_turret/attack_hand(mob/user as mob) + if(admin_only && !check_rights(R_ADMIN)) + to_chat(user, " The turret's control panel is glowing red and appears to be remotely locked down.") + return user.set_machine(src) var/dat = {" - [src] Control + [src] control Power: [on?"on":"off"]
Scan Range: - [scan_range] +
@@ -622,7 +633,16 @@ for(var/scan in scan_for) dat += "
[scan] ([scan_for[scan]?"Yes":"No"])
" - dat += {"Ammo: [max(0, projectiles)]
+ dat += "Ammo: [max(0, projectiles)]
" + if(check_rights(R_ADMIN)) + dat += {"
Admin Options:
+ Admin-only mode: [admin_only?"ON":"OFF"]
+ Projectile type: [projectile_type]
+ Projectiles per burst: [projectiles_per_shot]
+ Firing delay: [cooldown] deci-seconds
+ Set ammo #: [projectiles]
+ + "} user << browse(dat, "window=turret") @@ -652,6 +672,47 @@ if(href_list["scan_for"]) if(href_list["scan_for"] in scan_for) scan_for[href_list["scan_for"]] = !scan_for[href_list["scan_for"]] + if(href_list["admin_only"]) + if(!check_rights(R_ADMIN)) + return + src.admin_only = !src.admin_only + if(href_list["projectile_type"]) + if(!check_rights(R_ADMIN)) + return + var/list/valid_turret_projectiles = existing_typesof(/obj/item/projectile/bullet) + existing_typesof(/obj/item/projectile/energy) + var/userinput = filter_list_input("New projectile typepath", "You can only pick one!", valid_turret_projectiles) + if(!userinput) + to_chat(usr, "No projetile typepath entered. The turret's projectile remains unchanged.") + return + projectile_type = userinput + + if(href_list["projectile_burst"]) + if(!check_rights(R_ADMIN)) + return + var/userinput = input("Enter new # of projectiles in a burst-fire", "RATATATTATATA", 2) as num + if(userinput > 5) + projectiles_per_shot = 5 + to_chat(usr, "Error: Max burst-fire exceeded. Burst-fire set to 5.") + return + projectiles_per_shot = max(1, userinput) + if(href_list["firing_delay"]) + if(!check_rights(R_ADMIN)) + return + var/userinput = input("Enter new firing delay (as tenths of a second)", "RATATATTATATA", 20) as num + if(userinput <= 0) + cooldown = 1 + to_chat(usr, "Error: Firing cooldown floor reached. Cooldown set to 1/10th of a second.") + return + cooldown = userinput + if(href_list["force_ammo_amt"]) + if(!check_rights(R_ADMIN)) + return + var/userinput = input("Enter new # of projectiles left in the turret", "RATATATTATATA", 100) as num + if(userinput < 0) + projectiles = 0 + to_chat(usr, "Error: Setting negative projectiles is a bad idea, okay? Don't do that. Projectiles reset to 0.") + return + projectiles = userinput src.updateUsrDialog() return @@ -730,7 +791,7 @@ if (targloc == curloc) continue playsound(src, 'sound/weapons/Gunshot.ogg', 50, 1) - var/obj/item/projectile/A = new /obj/item/projectile(curloc) + var/obj/item/projectile/A = new projectile_type(curloc) src.projectiles-- A.original = target A.current = curloc @@ -743,6 +804,9 @@ sleep(2) return +/obj/structure/turret/gun_turret/admin + admin_only = 1 + /obj/machinery/turret/Destroy() // deletes its own cover with it if(cover) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 41b13cd8752..ea566f1bb90 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -868,6 +868,7 @@ var/global/floorIsLava = 0 Egalitarian Station Mode (removes access on doors except for Command and Security)
Give the AIs a randomly generated Lawset.
Toggle Buddha Mode on/off for everyone
+ Spawn a customizable turret

Make all areas powered
Make all areas unpowered
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 57396d8ec90..8357884379c 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -4323,6 +4323,13 @@ if(H.client) to_chat(H, "The tranquility that once filled your soul has vanished. You are once again a slave to your worldly desires.") + if("spawn_custom_turret") + if(alert("Are you sure you'd like to spawn a custom turret at your location?", "Confirmation", "Yes", "Cancel") == "Cancel") + return + new /obj/structure/turret/gun_turret/admin(get_turf(usr)) + log_admin("[key_name(usr)] has spawned a customizable turret at [get_coordinates_string(usr)].") + message_admins("[key_name(usr)] has spawned a customizable turret at [get_coordinates_string(usr)].") + if("vermin_infestation") var/list/locations = list( "RANDOM" = null,