From 6c4d687db6c0ccca8a13275d59245b8313ed67e0 Mon Sep 17 00:00:00 2001 From: AnturK Date: Thu, 21 Dec 2017 07:11:32 +0100 Subject: [PATCH 1/2] Immovable rod abuse, smite and event trigger. (#33681) --- code/__DEFINES/admin.dm | 1 + code/modules/admin/verbs/randomverbs.dm | 8 ++++- code/modules/events/immovable_rod.dm | 41 ++++++++++++++++++++++--- 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index 65d028ea34..7622fc0ea7 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -145,6 +145,7 @@ #define ADMIN_PUNISHMENT_GIB "Gib" #define ADMIN_PUNISHMENT_BSA "Bluespace Artillery Device" #define ADMIN_PUNISHMENT_FIREBALL "Fireball" +#define ADMIN_PUNISHMENT_ROD "Immovable Rod" #define AHELP_ACTIVE 1 #define AHELP_CLOSED 2 diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index eed265598e..8f13d887aa 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -1207,7 +1207,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits if(!holder) return - var/list/punishment_list = list(ADMIN_PUNISHMENT_LIGHTNING, ADMIN_PUNISHMENT_BRAINDAMAGE, ADMIN_PUNISHMENT_GIB, ADMIN_PUNISHMENT_BSA, ADMIN_PUNISHMENT_FIREBALL) + var/list/punishment_list = list(ADMIN_PUNISHMENT_LIGHTNING, ADMIN_PUNISHMENT_BRAINDAMAGE, ADMIN_PUNISHMENT_GIB, ADMIN_PUNISHMENT_BSA, ADMIN_PUNISHMENT_FIREBALL, ADMIN_PUNISHMENT_ROD) var/punishment = input("Choose a punishment", "DIVINE SMITING") as null|anything in punishment_list @@ -1229,6 +1229,12 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits bluespace_artillery(target) if(ADMIN_PUNISHMENT_FIREBALL) new /obj/effect/temp_visual/target(get_turf(target)) + if(ADMIN_PUNISHMENT_ROD) + var/turf/T = get_turf(target) + var/startside = pick(GLOB.cardinals) + var/turf/startT = spaceDebrisStartLoc(startside, T.z) + var/turf/endT = spaceDebrisFinishLoc(startside, T.z) + new /obj/effect/immovablerod(startT, endT,target) var/msg = "[key_name_admin(usr)] punished [key_name_admin(target)] with [punishment]." message_admins(msg) diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm index b933e566be..9612fd8018 100644 --- a/code/modules/events/immovable_rod.dm +++ b/code/modules/events/immovable_rod.dm @@ -12,6 +12,16 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 typepath = /datum/round_event/immovable_rod min_players = 15 max_occurrences = 5 + var/atom/special_target + + +/datum/round_event_control/immovable_rod/admin_setup() + if(!check_rights(R_FUN)) + return + + var/aimed = alert("Aimed at current location?","Sniperod", "Yes", "No") + if(aimed == "Yes") + special_target = get_turf(usr) /datum/round_event/immovable_rod announceWhen = 5 @@ -20,10 +30,11 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 priority_announce("What the fuck was that?!", "General Alert") /datum/round_event/immovable_rod/start() + var/datum/round_event_control/immovable_rod/C = control var/startside = pick(GLOB.cardinals) var/turf/startT = spaceDebrisStartLoc(startside, ZLEVEL_STATION_PRIMARY) var/turf/endT = spaceDebrisFinishLoc(startside, ZLEVEL_STATION_PRIMARY) - new /obj/effect/immovablerod(startT, endT) + new /obj/effect/immovablerod(startT, endT, C.special_target) /obj/effect/immovablerod name = "immovable rod" @@ -36,18 +47,28 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 var/z_original = 0 var/destination var/notify = TRUE + var/atom/special_target -/obj/effect/immovablerod/New(atom/start, atom/end) +/obj/effect/immovablerod/New(atom/start, atom/end, aimed_at) ..() SSaugury.register_doom(src, 2000) z_original = z destination = end + special_target = aimed_at if(notify) notify_ghosts("\A [src] is inbound!", enter_link="(Click to orbit)", source=src, action=NOTIFY_ORBIT) GLOB.poi_list += src - if(end && end.z==z_original) + + var/special_target_valid = FALSE + if(special_target) + var/turf/T = get_turf(special_target) + if(T.z == z_original) + special_target_valid = TRUE + if(special_target_valid) + walk_towards(src, special_target, 1) + else if(end && end.z==z_original) walk_towards(src, destination, 1) /obj/effect/immovablerod/Topic(href, href_list) @@ -60,11 +81,20 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 GLOB.poi_list -= src . = ..() -/obj/effect/immovablerod/Move() +/obj/effect/immovablerod/Moved() if((z != z_original) || (loc == destination)) qdel(src) + if(special_target && loc == get_turf(special_target)) + complete_trajectory() return ..() +/obj/effect/immovablerod/proc/complete_trajectory() + //We hit what we wanted to hit, time to go + special_target = null + destination = get_edge_target_turf(src, dir) + walk(src,0) + walk_towards(src, destination, 1) + /obj/effect/immovablerod/ex_act(severity, target) return 0 @@ -83,6 +113,9 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 x = clong.x y = clong.y + if(special_target && clong == special_target) + complete_trajectory() + if(isturf(clong) || isobj(clong)) if(clong.density) clong.ex_act(EXPLODE_HEAVY)