Files

301 lines
12 KiB
Plaintext

/client/proc/smite(mob/victim as mob)
set name = "Smite"
set desc = "Abuse a player with various 'special treatments' from a list."
set category = "Fun"
if(!check_rights(R_FUN))
return
if(!victim)
victim = input("Select a player", "Who?") as null|mob in GLOB.player_list
if(!ishuman(victim))
return
var/mob/living/carbon/human/target = victim
var/list/smite_types = list(
SMITE_BREAKLEGS,
SMITE_BLUESPACEARTILLERY,
SMITE_SPONTANEOUSCOMBUSTION,
SMITE_LIGHTNINGBOLT,
SMITE_DISLOCATEALL,
SMITE_AUTOSAVE,
SMITE_AUTOSAVE_WIDE,
SMITE_DARKSPACE_ABDUCT,
SMITE_DROP_LIMB_RANDOM,
SMITE_DROP_LIMB_ALL,
SMITE_DROP_LIMB_PICK,
SMITE_VALIDHUNT
)
var/smite_choice = input("Select the type of SMITE for [target]","SMITE Type Choice") as null|anything in smite_types
if(!smite_choice)
return
switch(smite_choice)
if(SMITE_BREAKLEGS)
var/broken_legs = 0
var/obj/item/organ/external/left_leg = target.get_organ(BP_L_LEG)
if(left_leg && left_leg.fracture())
broken_legs++
var/obj/item/organ/external/right_leg = target.get_organ(BP_R_LEG)
if(right_leg && right_leg.fracture())
broken_legs++
if(!broken_legs)
to_chat(src,"[target] didn't have any breakable legs, sorry.")
if(SMITE_DISLOCATEALL)
var/obj/item/organ/external/left_leg = target.get_organ(BP_L_LEG)
left_leg.dislocate()
var/obj/item/organ/external/right_leg = target.get_organ(BP_R_LEG)
right_leg.dislocate()
var/obj/item/organ/external/left_arm = target.get_organ(BP_L_ARM)
left_arm.dislocate()
var/obj/item/organ/external/right_arm = target.get_organ(BP_R_ARM)
right_arm.dislocate()
var/obj/item/organ/external/head = target.get_organ(BP_HEAD)
head.dislocate()
if(SMITE_DROP_LIMB_PICK)
var/picked_organ_tag = input("Select the limb you wanna remove of [target]","Limb Choice") as null|anything in list(BP_L_LEG, BP_R_LEG, BP_L_ARM, BP_R_ARM,BP_R_FOOT,BP_L_FOOT, BP_R_HAND, BP_L_HAND)
var/obj/item/organ/external/limb = target.get_organ(picked_organ_tag)
to_chat(target, SPAN_ALERTSYNDIE("Your sins have cost you your [limb.name]"))
limb?.droplimb(FALSE, pick(DROPLIMB_EDGE,DROPLIMB_BURN,DROPLIMB_BLUNT))
if(SMITE_DROP_LIMB_RANDOM)
var/rand_organ_tag = pick(BP_L_LEG, BP_R_LEG)
var/obj/item/organ/external/limb = target.get_organ(rand_organ_tag)
limb?.droplimb(FALSE, pick(DROPLIMB_EDGE,DROPLIMB_BURN,DROPLIMB_BLUNT))
rand_organ_tag = pick(BP_L_ARM, BP_R_ARM)
limb = target.get_organ(rand_organ_tag)
limb?.droplimb(FALSE, pick(DROPLIMB_EDGE,DROPLIMB_BURN,DROPLIMB_BLUNT))
to_chat(target, SPAN_ALERTSYNDIE("Your sins have cost you an arm and an leg"))
if(SMITE_DROP_LIMB_ALL)
for( var/limb_tag in list(BP_L_LEG, BP_R_LEG, BP_L_ARM, BP_R_ARM))
var/obj/item/organ/external/limb = target.get_organ(limb_tag)
limb?.droplimb(FALSE, pick(DROPLIMB_EDGE,DROPLIMB_BURN,DROPLIMB_BLUNT))
to_chat(target, SPAN_ALERTSYNDIE(pick("The gods have bestowed you nuggethood", "The gods crave McDonalds", "The gods have turned you into a fucknugget")))
if(SMITE_BLUESPACEARTILLERY)
bluespace_artillery(target,src)
if(SMITE_SPONTANEOUSCOMBUSTION)
target.adjust_fire_stacks(10)
target.IgniteMob()
target.visible_message("<span class='danger'>[target] bursts into flames!</span>")
if(SMITE_LIGHTNINGBOLT)
var/turf/T = get_step(get_step(target, NORTH), NORTH)
T.Beam(target, icon_state="lightning[rand(1,12)]", time = 5)
// a gigajoule lmfao
target.electrocute(1000000, 75, 50, ELECTROCUTE_ACT_FLAG_DISTRIBUTE, BP_HEAD)
target.visible_message("<span class='danger'>[target] is struck by lightning!</span>")
if(SMITE_AUTOSAVE)
var/time_to_stun = tgui_input_number(src, "How long would you like the saving to take? (in seconds)", "Autosave Time", 10, min_value = 1)
fake_autosave(target, time_to_stun, src)
if(SMITE_AUTOSAVE_WIDE)
var/time_to_stun = tgui_input_number(src, "How long would you like the saving to take? (in seconds)", "Autosave Time", 10, min_value = 1)
fake_autosave(target, time_to_stun, src, TRUE)
if(SMITE_DARKSPACE_ABDUCT)
darkspace_abduction(target, src)
if(SMITE_VALIDHUNT)
var/noncanon = tgui_alert(src, "Would you like to announce that [target] is now noncanon?", "Validhunting time", list("Yes", "No", "Wait no LET THEM LIVE"))
if(noncanon == "Wait no LET THEM LIVE")
return
var/exclude = tgui_alert(src, "Would you like [target] to be aware that they are now KOS?", "They're valid now", list("Yes", "No"))
validhunting_time(target, src, ((noncanon == "Yes") ? TRUE : FALSE), ((exclude == "No") ? TRUE : FALSE))
else
return //Injection? Don't print any messages.
log_and_message_admins("[key_name(src)] has used SMITE ([smite_choice]) on [key_name(target)].")
feedback_add_details("admin_verb","SMITE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/proc/bluespace_artillery(mob/living/target, user)
if(!istype(target))
return
if(BSACooldown)
if(user)
to_chat(user,"<span class='warning'>BSA is still cooling down, please wait!</span>")
return
BSACooldown = 1
spawn(50)
BSACooldown = 0
to_chat(target,"You've been hit by bluespace artillery!")
log_and_message_admins("[key_name(target)] has been hit by Bluespace Artillery fired by [key_name(user ? user : usr)]")
var/turf/simulated/floor/T = get_turf(target)
if(istype(T))
if(prob(80))
T.break_tile_to_plating()
else
T.break_tile()
if(target.health == 1)
target.gib()
else
target.adjustBruteLoss( min( 99 , (target.health - 1) ) )
target.afflict_stun(20 * 20)
target.afflict_paralyze(20 * 20)
target.stuttering = 20
/proc/fake_autosave(var/mob/living/target, var/duration, var/client/user, var/wide)
if(!istype(target) || !target.client)
to_chat(user, "<span class='warning'>Skipping [target] because they are not a /mob/living or have no client.</span>")
return
if(wide)
for(var/mob/living/L in orange(user.view, user.mob))
fake_autosave(L, duration, user)
return
target.applyMoveCooldown(duration SECONDS)
to_chat(target, "<span class='notice' style='font: small-caps bold large monospace!important'>Autosaving your progress, please wait...</span>")
target << 'sound/effects/ding.ogg'
var/static/list/bad_tips = list(
"Did you know that black shoes protect you from electrocution while hacking?",
"Did you know that airlocks always have a wire that disables ID checks?",
"You can always find at least 3 pairs of glowing purple gloves in maint!",
"Phoron is not toxic if you've had a soda within 30 seconds of exposure!",
"Space Mountain Wind makes you immune to damage from space for 30 seconds!",
"A mask and air tank are all you need to be safe in space!",
"When exploring maintenance, wearing no shoes makes you move faster!",
"Did you know that the bartender's shotgun is loaded with harmless ammo?",
"Did you know that the tesla and singulo only need containment for 5 minutes?",
"Did you know that Admins can't ban you if you don't give them consent?")
var/tip = pick(bad_tips)
to_chat(target, "<span class='notice' style='font: small-caps bold large monospace!important'>Tip of the day:</span><br><span class='notice'>[tip]</span>")
var/atom/movable/screen/loader = new(target)
loader.name = "Autosaving..."
loader.desc = "A disc icon that represents your game autosaving. Please wait."
loader.icon = 'icons/obj/discs_vr.dmi'
loader.icon_state = "quicksave"
loader.screen_loc = "NORTH-1, EAST-1"
target.client.screen += loader
spawn(duration SECONDS)
if(target)
to_chat(target, "<span class='notice' style='font: small-caps bold large monospace!important'>Autosave complete!</span>")
if(target.client)
target.client.screen -= loader
/proc/darkspace_abduction(mob/living/target, user)
var/static/darkspace_abduction_z
if(darkspace_abduction_z < 0)
to_chat(user,"<span class='warning'>The abduction z-level is already being created. Please wait.</span>")
return
if(!darkspace_abduction_z)
darkspace_abduction_z = -1
to_chat(user,"<span class='warning'>This is the first use of the verb this shift, it will take a minute to configure the abduction z-level. It will be z[world.maxz+1].</span>")
var/datum/map_level/level = SSmapping.allocate_level()
var/z = level.z_index
var/area/areaInstance = new /area/darkspace_abduction(null)
areaInstance.addSorted()
for(var/x = 1 to world.maxx)
for(var/y = 1 to world.maxy)
var/turf/T = locate(x,y,z)
T.ChangeTurf(/turf/unsimulated/fake_space)
T.plane = -100
areaInstance.contents.Add(T)
CHECK_TICK
darkspace_abduction_z = z
if(!target || !user)
return
var/size_of_square = 26
var/halfbox = round(size_of_square*0.5)
target.transforming = TRUE
to_chat(target,"<span class='danger'>You feel a strange tug, deep inside. You're frozen in momentarily...</span>")
to_chat(user,"<span class='notice'>Beginning vis_contents copy to abduction site, player mob is frozen.</span>")
sleep(1 SECOND)
//Lower left corner of a working box
var/llc_x = max(0,halfbox-target.x) + min(target.x+halfbox, world.maxx) - size_of_square
var/llc_y = max(0,halfbox-target.y) + min(target.y+halfbox, world.maxy) - size_of_square
//Copy them all
for(var/x = llc_x to llc_x+size_of_square)
for(var/y = llc_y to llc_y+size_of_square)
var/turf/T_src = locate(x,y,target.z)
var/turf/T_dest = locate(x,y,darkspace_abduction_z)
T_dest.vis_contents.Cut()
T_dest.vis_contents += T_src
T_dest.density = T_src.density
T_dest.opacity = T_src.opacity
CHECK_TICK
//Feather the edges
for(var/x = llc_x to llc_x+1) //Left
for(var/y = llc_y to llc_y+size_of_square)
if(prob(50))
var/turf/T = locate(x,y,darkspace_abduction_z)
T.density = FALSE
T.opacity = FALSE
T.vis_contents.Cut()
for(var/x = llc_x+size_of_square-1 to llc_x+size_of_square) //Right
for(var/y = llc_y to llc_y+size_of_square)
if(prob(50))
var/turf/T = locate(x,y,darkspace_abduction_z)
T.density = FALSE
T.opacity = FALSE
T.vis_contents.Cut()
for(var/x = llc_x to llc_x+size_of_square) //Top
for(var/y = llc_y+size_of_square-1 to llc_y+size_of_square)
if(prob(50))
var/turf/T = locate(x,y,darkspace_abduction_z)
T.density = FALSE
T.opacity = FALSE
T.vis_contents.Cut()
for(var/x = llc_x to llc_x+size_of_square) //Bottom
for(var/y = llc_y to llc_y+1)
if(prob(50))
var/turf/T = locate(x,y,darkspace_abduction_z)
T.density = FALSE
T.opacity = FALSE
T.vis_contents.Cut()
target.forceMove(locate(target.x,target.y,darkspace_abduction_z))
to_chat(target,"<span class='danger'>The tug relaxes, but everything around you looks... slightly off.</span>")
to_chat(user,"<span class='notice'>The mob has been moved. ([admin_jump_link(target,usr.client.holder)])</span>")
target.transforming = FALSE
/proc/validhunting_time(mob/living/target, user, declare_noncanon, exclude_target)
if(!istype(target))
return
var/image/killsign = image('icons/effects/killsign.dmi', target, declare_noncanon ? "noncanon" : "kill", ABOVE_LIGHTING_LAYER_MAIN)
killsign.pixel_z = 16
killsign.plane = ABOVE_LIGHTING_PLANE
killsign.appearance_flags = KEEP_APART | RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM | NO_CLIENT_COLOR
var/list/recipients = list()
for(var/mob/M in GLOB.player_list)
if(exclude_target && M == target)
continue
var/client/C = M.client
if(!istype(C))
continue
C.images += killsign
recipients += M
if(declare_noncanon)
for(var/mob/M in recipients)
to_chat(M, "<span class ='danger minorannounce'>[target] is now non-canon.</span><br><span class='danger'>[target] is now valid to kill on sight. All actions performed in pursuit of killing them are non-canon, with the exception of any collateral damage that may occur.</span>")
M.playsound_local(get_turf(M), 'sound/misc/notice1.ogg', 50)