diff --git a/code/modules/admin/admin_verb_lists_vr.dm b/code/modules/admin/admin_verb_lists_vr.dm
index 1f6c07711b..83ab12ca0e 100644
--- a/code/modules/admin/admin_verb_lists_vr.dm
+++ b/code/modules/admin/admin_verb_lists_vr.dm
@@ -163,7 +163,6 @@ var/list/admin_verbs_fun = list(
/datum/admins/proc/call_supply_drop,
/datum/admins/proc/call_drop_pod,
/client/proc/smite,
- /client/proc/smite_vr, //VOREStation Add,
/client/proc/admin_lightning_strike,
/client/proc/resize, //VOREStation Add,
/client/proc/cmd_admin_droppod_deploy,
diff --git a/code/modules/admin/verbs/map_template_loadverb.dm b/code/modules/admin/verbs/map_template_loadverb.dm
index 17e612f30e..7b2fa323d3 100644
--- a/code/modules/admin/verbs/map_template_loadverb.dm
+++ b/code/modules/admin/verbs/map_template_loadverb.dm
@@ -35,7 +35,8 @@
message_admins("[key_name_admin(usr)] has placed a map template ([template.name]).")
else
to_chat(usr, "Failed to place map")
- usr.client.images -= preview
+ if(usr)
+ usr.client.images -= preview
/client/proc/map_template_load_on_new_z()
set category = "Debug"
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 8a77a2b854..7106a677c1 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -113,11 +113,14 @@
return
var/msg = tgui_input_text(usr, "Message:", text("Enter the text you wish to appear to everyone:"))
- if(!(msg[1] == "<" && msg[length(msg)] == ">")) //You can use HTML but only if the whole thing is HTML. Tries to prevent admin 'accidents'.
- msg = sanitize(msg)
if (!msg)
return
+ if(!(msg[1] == "<" && msg[length(msg)] == ">")) //You can use HTML but only if the whole thing is HTML. Tries to prevent admin 'accidents'.
+ msg = sanitize(msg)
+ if (!msg) // We check both before and after, just in case sanitization ended us up with empty message.
+ return
+
to_world("[msg]")
log_admin("GlobalNarrate: [key_name(usr)] : [msg]")
message_admins(" GlobalNarrate: [key_name_admin(usr)] : [msg]
", 1)
diff --git a/code/modules/admin/verbs/smite.dm b/code/modules/admin/verbs/smite.dm
index c6b6f8dcee..b08798fac0 100644
--- a/code/modules/admin/verbs/smite.dm
+++ b/code/modules/admin/verbs/smite.dm
@@ -8,12 +8,17 @@
if(!istype(target))
return
- var/list/smite_types = list(SMITE_PIE, SMITE_SPICE, SMITE_BREAKLEGS,SMITE_BLUESPACEARTILLERY,SMITE_SPONTANEOUSCOMBUSTION,SMITE_LIGHTNINGBOLT) //CHOMP Add pie and spicy air
+ var/list/smite_types = list(SMITE_BREAKLEGS,SMITE_BLUESPACEARTILLERY,SMITE_SPONTANEOUSCOMBUSTION,SMITE_LIGHTNINGBOLT,
+ SMITE_SHADEKIN_ATTACK,SMITE_SHADEKIN_NOMF,SMITE_AD_SPAM,SMITE_REDSPACE_ABDUCT,SMITE_AUTOSAVE,SMITE_AUTOSAVE_WIDE,
+ SMITE_PIE, SMITE_SPICE) //CHOMP Add pie and spicy air
var/smite_choice = tgui_input_list(usr, "Select the type of SMITE for [target]","SMITE Type Choice", smite_types)
if(!smite_choice)
return
+ 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!
+
switch(smite_choice)
if(SMITE_BREAKLEGS)
var/broken_legs = 0
@@ -40,6 +45,120 @@
target.electrocute_act(75,def_zone = BP_HEAD)
target.visible_message("[target] is struck by lightning!")
+ if(SMITE_SHADEKIN_ATTACK)
+ var/turf/Tt = get_turf(target) //Turf for target
+
+ if(target.loc != Tt)
+ return //Too hard to attack someone in something
+
+ var/turf/Ts //Turf for shadekin
+
+ //Try to find nondense turf
+ for(var/direction in cardinal)
+ var/turf/T = get_step(target,direction)
+ if(T && !T.density)
+ Ts = T //Found shadekin spawn turf
+ if(!Ts)
+ return //Didn't find shadekin spawn turf
+
+ var/mob/living/simple_mob/shadekin/red/shadekin = new(Ts)
+ //Abuse of shadekin
+ shadekin.real_name = shadekin.name
+ shadekin.init_vore()
+ shadekin.ability_flags |= 0x1
+ shadekin.phase_shift()
+ shadekin.ai_holder.give_target(target)
+ shadekin.ai_holder.hostile = FALSE
+ shadekin.ai_holder.mauling = TRUE
+ shadekin.Life()
+ //Remove when done
+ spawn(10 SECONDS)
+ if(shadekin)
+ shadekin.death()
+
+ if(SMITE_SHADEKIN_NOMF)
+ var/static/list/kin_types = list(
+ "Red Eyes (Dark)" = /mob/living/simple_mob/shadekin/red/dark,
+ "Red Eyes (Light)" = /mob/living/simple_mob/shadekin/red/white,
+ "Red Eyes (Brown)" = /mob/living/simple_mob/shadekin/red/brown,
+ "Blue Eyes (Dark)" = /mob/living/simple_mob/shadekin/blue/dark,
+ "Blue Eyes (Light)" = /mob/living/simple_mob/shadekin/blue/white,
+ "Blue Eyes (Brown)" = /mob/living/simple_mob/shadekin/blue/brown,
+ "Purple Eyes (Dark)" = /mob/living/simple_mob/shadekin/purple/dark,
+ "Purple Eyes (Light)" = /mob/living/simple_mob/shadekin/purple/white,
+ "Purple Eyes (Brown)" = /mob/living/simple_mob/shadekin/purple/brown,
+ "Yellow Eyes (Dark)" = /mob/living/simple_mob/shadekin/yellow/dark,
+ "Yellow Eyes (Light)" = /mob/living/simple_mob/shadekin/yellow/white,
+ "Yellow Eyes (Brown)" = /mob/living/simple_mob/shadekin/yellow/brown,
+ "Green Eyes (Dark)" = /mob/living/simple_mob/shadekin/green/dark,
+ "Green Eyes (Light)" = /mob/living/simple_mob/shadekin/green/white,
+ "Green Eyes (Brown)" = /mob/living/simple_mob/shadekin/green/brown,
+ "Orange Eyes (Dark)" = /mob/living/simple_mob/shadekin/orange/dark,
+ "Orange Eyes (Light)" = /mob/living/simple_mob/shadekin/orange/white,
+ "Orange Eyes (Brown)" = /mob/living/simple_mob/shadekin/orange/brown,
+ "Rivyr (Unique)" = /mob/living/simple_mob/shadekin/blue/rivyr)
+ var/kin_type = tgui_input_list(usr, "Select the type of shadekin for [target] nomf","Shadekin Type Choice", kin_types)
+ if(!kin_type || !target)
+ return
+
+
+ kin_type = kin_types[kin_type]
+
+ var/myself = tgui_alert(usr, "Control the shadekin yourself or delete pred and prey after?","Control Shadekin?",list("Control","Cancel","Delete"))
+ if(myself == "Cancel" || !target)
+ return
+
+ var/turf/Tt = get_turf(target)
+
+ if(target.loc != Tt)
+ return //Can't nom when not exposed
+
+ //Begin abuse
+ target.transforming = TRUE //Cheap hack to stop them from moving
+ var/mob/living/simple_mob/shadekin/shadekin = new kin_type(Tt)
+ shadekin.real_name = shadekin.name
+ shadekin.init_vore()
+ shadekin.can_be_drop_pred = TRUE
+ shadekin.dir = SOUTH
+ shadekin.ability_flags |= 0x1
+ shadekin.phase_shift() //Homf
+ shadekin.energy = initial(shadekin.energy)
+ //For fun
+ sleep(1 SECOND)
+ shadekin.dir = WEST
+ sleep(1 SECOND)
+ shadekin.dir = EAST
+ sleep(1 SECOND)
+ shadekin.dir = SOUTH
+ sleep(1 SECOND)
+ shadekin.audible_message("[shadekin] belches loudly!", runemessage = "URRRRRP")
+ sleep(2 SECONDS)
+ shadekin.phase_shift()
+ target.transforming = FALSE //Undo cheap hack
+
+ if(myself == "Control") //Put admin in mob
+ shadekin.ckey = ckey
+
+ else //Permakin'd
+ to_chat(target,"You're carried off into The Dark by the [shadekin]. Who knows if you'll find your way back?")
+ target.ghostize()
+ qdel(target)
+ qdel(shadekin)
+
+
+ if(SMITE_REDSPACE_ABDUCT)
+ redspace_abduction(target, src)
+
+ if(SMITE_AUTOSAVE)
+ fake_autosave(target, src)
+
+ if(SMITE_AUTOSAVE_WIDE)
+ fake_autosave(target, src, TRUE)
+
+ if(SMITE_AD_SPAM)
+ if(target.client)
+ target.client.create_fake_ad_popup_multiple(/obj/screen/popup/default, 15)
+
if(SMITE_PIE) //CHOMP Add
new/obj/effect/decal/cleanable/pie_smudge(get_turf(target))
playsound(target, 'sound/effects/slime_squish.ogg', 100, 1, get_rand_frequency(), falloff = 5)
@@ -57,9 +176,6 @@
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
@@ -83,3 +199,134 @@
target.Stun(20)
target.Weaken(20)
target.stuttering = 20
+
+var/redspace_abduction_z
+
+/area/redspace_abduction
+ name = "Another Time And Place"
+ requires_power = FALSE
+ dynamic_lighting = FALSE
+
+/proc/redspace_abduction(mob/living/target, user)
+ if(redspace_abduction_z < 0)
+ to_chat(user,"The abduction z-level is already being created. Please wait.")
+ return
+ if(!redspace_abduction_z)
+ redspace_abduction_z = -1
+ to_chat(user,"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].")
+ var/z = ++world.maxz
+ world.max_z_changed()
+ for(var/x = 1 to world.maxx)
+ for(var/y = 1 to world.maxy)
+ var/turf/T = locate(x,y,z)
+ new /area/redspace_abduction(T)
+ T.ChangeTurf(/turf/unsimulated/fake_space)
+ T.plane = -100
+ CHECK_TICK
+ redspace_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,"You feel a strange tug, deep inside. You're frozen in momentarily...")
+ to_chat(user,"Beginning vis_contents copy to abduction site, player mob is frozen.")
+ 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,redspace_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,redspace_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,redspace_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,redspace_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,redspace_abduction_z)
+ T.density = FALSE
+ T.opacity = FALSE
+ T.vis_contents.Cut()
+
+ target.forceMove(locate(target.x,target.y,redspace_abduction_z))
+ to_chat(target,"The tug relaxes, but everything around you looks... slightly off.")
+ to_chat(user,"The mob has been moved. ([admin_jump_link(target,usr.client.holder)])")
+
+ target.transforming = FALSE
+
+/proc/fake_autosave(var/mob/living/target, var/client/user, var/wide)
+ if(!istype(target) || !target.client)
+ to_chat(user, "Skipping [target] because they are not a /mob/living or have no client.")
+ return
+
+ if(wide)
+ for(var/mob/living/L in orange(user.view, user.mob))
+ fake_autosave(L, user)
+ return
+
+ target.setMoveCooldown(10 SECONDS)
+
+ to_chat(target, "Autosaving your progress, please wait...")
+ 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?")
+
+ var/tip = pick(bad_tips)
+ to_chat(target, "Tip of the day:
[tip]")
+
+ var/obj/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(10 SECONDS)
+ if(target)
+ to_chat(target, "Autosave complete!")
+ if(target.client)
+ target.client.screen -= loader
diff --git a/code/modules/admin/verbs/smite_vr.dm b/code/modules/admin/verbs/smite_vr.dm
deleted file mode 100644
index fc8452831c..0000000000
--- a/code/modules/admin/verbs/smite_vr.dm
+++ /dev/null
@@ -1,267 +0,0 @@
-/client/proc/smite_vr(var/mob/living/carbon/human/target in player_list)
- set name = "Smite (Vore)"
- set desc = "Abuse a player with various 'special Vore-brand treatments' from a list."
- set category = "Fun"
- if(!check_rights(R_ADMIN|R_FUN))
- return
-
- if(!istype(target))
- return
-
- var/list/smite_types = list(SMITE_SHADEKIN_ATTACK,SMITE_SHADEKIN_NOMF,SMITE_AD_SPAM,SMITE_REDSPACE_ABDUCT,SMITE_AUTOSAVE,SMITE_AUTOSAVE_WIDE)
-
- var/smite_choice = tgui_input_list(usr, "Select the type of SMITE for [target]","SMITE Type Choice", smite_types)
- if(!smite_choice)
- return
-
- log_and_message_admins("[key_name(src)] has used SMITE (Vore) ([smite_choice]) on [key_name(target)].")
- feedback_add_details("admin_verb","SMITEV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
- switch(smite_choice)
- if(SMITE_SHADEKIN_ATTACK)
- var/turf/Tt = get_turf(target) //Turf for target
-
- if(target.loc != Tt)
- return //Too hard to attack someone in something
-
- var/turf/Ts //Turf for shadekin
-
- //Try to find nondense turf
- for(var/direction in cardinal)
- var/turf/T = get_step(target,direction)
- if(T && !T.density)
- Ts = T //Found shadekin spawn turf
- if(!Ts)
- return //Didn't find shadekin spawn turf
-
- var/mob/living/simple_mob/shadekin/red/shadekin = new(Ts)
- //Abuse of shadekin
- shadekin.real_name = shadekin.name
- shadekin.init_vore()
- shadekin.ability_flags |= 0x1
- shadekin.phase_shift()
- shadekin.ai_holder.give_target(target)
- shadekin.ai_holder.hostile = FALSE
- shadekin.ai_holder.mauling = TRUE
- shadekin.Life()
- //Remove when done
- spawn(10 SECONDS)
- if(shadekin)
- shadekin.death()
-
- if(SMITE_SHADEKIN_NOMF)
- var/static/list/kin_types = list(
- "Red Eyes (Dark)" = /mob/living/simple_mob/shadekin/red/dark,
- "Red Eyes (Light)" = /mob/living/simple_mob/shadekin/red/white,
- "Red Eyes (Brown)" = /mob/living/simple_mob/shadekin/red/brown,
- "Blue Eyes (Dark)" = /mob/living/simple_mob/shadekin/blue/dark,
- "Blue Eyes (Light)" = /mob/living/simple_mob/shadekin/blue/white,
- "Blue Eyes (Brown)" = /mob/living/simple_mob/shadekin/blue/brown,
- "Purple Eyes (Dark)" = /mob/living/simple_mob/shadekin/purple/dark,
- "Purple Eyes (Light)" = /mob/living/simple_mob/shadekin/purple/white,
- "Purple Eyes (Brown)" = /mob/living/simple_mob/shadekin/purple/brown,
- "Yellow Eyes (Dark)" = /mob/living/simple_mob/shadekin/yellow/dark,
- "Yellow Eyes (Light)" = /mob/living/simple_mob/shadekin/yellow/white,
- "Yellow Eyes (Brown)" = /mob/living/simple_mob/shadekin/yellow/brown,
- "Green Eyes (Dark)" = /mob/living/simple_mob/shadekin/green/dark,
- "Green Eyes (Light)" = /mob/living/simple_mob/shadekin/green/white,
- "Green Eyes (Brown)" = /mob/living/simple_mob/shadekin/green/brown,
- "Orange Eyes (Dark)" = /mob/living/simple_mob/shadekin/orange/dark,
- "Orange Eyes (Light)" = /mob/living/simple_mob/shadekin/orange/white,
- "Orange Eyes (Brown)" = /mob/living/simple_mob/shadekin/orange/brown,
- "Rivyr (Unique)" = /mob/living/simple_mob/shadekin/blue/rivyr)
- var/kin_type = tgui_input_list(usr, "Select the type of shadekin for [target] nomf","Shadekin Type Choice", kin_types)
- if(!kin_type || !target)
- return
-
-
- kin_type = kin_types[kin_type]
-
- var/myself = tgui_alert(usr, "Control the shadekin yourself or delete pred and prey after?","Control Shadekin?",list("Control","Cancel","Delete"))
- if(myself == "Cancel" || !target)
- return
-
- var/turf/Tt = get_turf(target)
-
- if(target.loc != Tt)
- return //Can't nom when not exposed
-
- //Begin abuse
- target.transforming = TRUE //Cheap hack to stop them from moving
- var/mob/living/simple_mob/shadekin/shadekin = new kin_type(Tt)
- shadekin.real_name = shadekin.name
- shadekin.init_vore()
- shadekin.can_be_drop_pred = TRUE
- shadekin.dir = SOUTH
- shadekin.ability_flags |= 0x1
- shadekin.phase_shift() //Homf
- shadekin.energy = initial(shadekin.energy)
- //For fun
- sleep(1 SECOND)
- shadekin.dir = WEST
- sleep(1 SECOND)
- shadekin.dir = EAST
- sleep(1 SECOND)
- shadekin.dir = SOUTH
- sleep(1 SECOND)
- shadekin.audible_message("[shadekin] belches loudly!", runemessage = "URRRRRP")
- sleep(2 SECONDS)
- shadekin.phase_shift()
- target.transforming = FALSE //Undo cheap hack
-
- if(myself == "Control") //Put admin in mob
- shadekin.ckey = ckey
-
- else //Permakin'd
- to_chat(target,"You're carried off into The Dark by the [shadekin]. Who knows if you'll find your way back?")
- target.ghostize()
- qdel(target)
- qdel(shadekin)
-
-
- if(SMITE_REDSPACE_ABDUCT)
- redspace_abduction(target, src)
-
- if(SMITE_AUTOSAVE)
- fake_autosave(target, src)
-
- if(SMITE_AUTOSAVE_WIDE)
- fake_autosave(target, src, TRUE)
-
- if(SMITE_AD_SPAM)
- if(target.client)
- target.client.create_fake_ad_popup_multiple(/obj/screen/popup/default, 15)
-
- else
- return //Injection? Don't print any messages.
-
-var/redspace_abduction_z
-
-/area/redspace_abduction
- name = "Another Time And Place"
- requires_power = FALSE
- dynamic_lighting = FALSE
-
-/proc/redspace_abduction(mob/living/target, user)
- if(redspace_abduction_z < 0)
- to_chat(user,"The abduction z-level is already being created. Please wait.")
- return
- if(!redspace_abduction_z)
- redspace_abduction_z = -1
- to_chat(user,"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].")
- var/z = ++world.maxz
- world.max_z_changed()
- for(var/x = 1 to world.maxx)
- for(var/y = 1 to world.maxy)
- var/turf/T = locate(x,y,z)
- new /area/redspace_abduction(T)
- T.ChangeTurf(/turf/unsimulated/fake_space)
- T.plane = -100
- CHECK_TICK
- redspace_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,"You feel a strange tug, deep inside. You're frozen in momentarily...")
- to_chat(user,"Beginning vis_contents copy to abduction site, player mob is frozen.")
- 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,redspace_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,redspace_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,redspace_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,redspace_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,redspace_abduction_z)
- T.density = FALSE
- T.opacity = FALSE
- T.vis_contents.Cut()
-
- target.forceMove(locate(target.x,target.y,redspace_abduction_z))
- to_chat(target,"The tug relaxes, but everything around you looks... slightly off.")
- to_chat(user,"The mob has been moved. ([admin_jump_link(target,usr.client.holder)])")
-
- target.transforming = FALSE
-
-/proc/fake_autosave(var/mob/living/target, var/client/user, var/wide)
- if(!istype(target) || !target.client)
- to_chat(user, "Skipping [target] because they are not a /mob/living or have no client.")
- return
-
- if(wide)
- for(var/mob/living/L in orange(user.view, user.mob))
- fake_autosave(L, user)
- return
-
- target.setMoveCooldown(10 SECONDS)
-
- to_chat(target, "Autosaving your progress, please wait...")
- 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?")
-
- var/tip = pick(bad_tips)
- to_chat(target, "Tip of the day:
[tip]")
-
- var/obj/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(10 SECONDS)
- if(target)
- to_chat(target, "Autosave complete!")
- if(target.client)
- target.client.screen -= loader
diff --git a/code/modules/clothing/clothing_accessories.dm b/code/modules/clothing/clothing_accessories.dm
index dbc0108c28..c16a7c671f 100644
--- a/code/modules/clothing/clothing_accessories.dm
+++ b/code/modules/clothing/clothing_accessories.dm
@@ -1,6 +1,6 @@
/obj/item/clothing/proc/can_attach_accessory(obj/item/clothing/accessory/A)
//Just no, okay
- if(!A.slot)
+ if(!istype(A) || !A.slot)
return FALSE
//Not valid at all, not in the valid list period.
diff --git a/code/modules/mob/living/living_vr.dm b/code/modules/mob/living/living_vr.dm
index eebb1f5cc1..4cc196dbb7 100644
--- a/code/modules/mob/living/living_vr.dm
+++ b/code/modules/mob/living/living_vr.dm
@@ -39,7 +39,7 @@
set_metainfo_likes(FALSE)
set_metainfo_dislikes(FALSE)
-/mob/living/verb/set_metainfo_panel()
+/mob/living/proc/set_metainfo_panel()
if(usr != src)
return
var/new_metadata = strip_html_simple(tgui_input_text(usr, "Enter any information you'd like others to see, such as Roleplay-preferences. This will not be saved permanently unless you click save in the OOC notes panel!", "Game Preference" , html_decode(ooc_notes), multiline = TRUE, prevent_enter = TRUE))
diff --git a/code/modules/mob/living/silicon/robot/robot_remote_control.dm b/code/modules/mob/living/silicon/robot/robot_remote_control.dm
index 1eba57a6dc..536e4953fe 100644
--- a/code/modules/mob/living/silicon/robot/robot_remote_control.dm
+++ b/code/modules/mob/living/silicon/robot/robot_remote_control.dm
@@ -201,7 +201,8 @@ GLOBAL_LIST_EMPTY(available_ai_shells)
/mob/living/silicon/robot/attack_ai(mob/user)
if(shell && config.allow_ai_shells && (!connected_ai || connected_ai == user))
var/mob/living/silicon/ai/AI = user
- AI.deploy_to_shell(src)
+ if(istype(AI)) // Just in case we're clicked by a borg
+ AI.deploy_to_shell(src)
else
return ..()
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm
index 1c48c4b2a1..6708a1abf1 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm
@@ -279,8 +279,9 @@
/mob/living/simple_mob/vore/alienanimals/catslug/Login() //If someone plays as us let's just be a passive mob in case accidents happen if the player D/Cs
. = ..()
- ai_holder.hostile = FALSE
- ai_holder.wander = FALSE
+ if(ai_holder)
+ ai_holder.hostile = FALSE
+ ai_holder.wander = FALSE
/mob/living/simple_mob/vore/alienanimals/catslug/proc/catslug_color()
set name = "Pick Color"
@@ -292,7 +293,7 @@
var/newcolor = input(usr, "Choose a color.", "", color) as color|null
if(newcolor)
color = newcolor
- picked_color = TRUE
+ picked_color = TRUE
update_icon()
/datum/ai_holder/simple_mob/melee/evasive/catslug/proc/consider_awakening()
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 106f82a30e..157317b8e2 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -569,16 +569,12 @@
h_user.put_in_l_hand(B)
else if (h_user.l_store == src)
h_user.drop_from_inventory(src)
- B.loc = h_user
- B.hud_layerise()
- h_user.l_store = B
- //h_user.update_inv_pockets() //Doesn't do anything
+ if(!h_user.equip_to_slot_if_possible(B, slot_l_store))
+ h_user.drop_from_inventory(B)
else if (h_user.r_store == src)
h_user.drop_from_inventory(src)
- B.loc = h_user
- B.hud_layerise()
- h_user.r_store = B
- //h_user.update_inv_pockets() //Doesn't do anything
+ if(!h_user.equip_to_slot_if_possible(B, slot_r_store))
+ h_user.drop_from_inventory(B)
else if (h_user.head == src)
h_user.u_equip(src)
h_user.put_in_hands(B)
diff --git a/icons/mob/vore/tails_vr.dmi b/icons/mob/vore/tails_vr.dmi
index 456f7949b1..2bc0f31224 100644
Binary files a/icons/mob/vore/tails_vr.dmi and b/icons/mob/vore/tails_vr.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index c229c2f051..322de3bd02 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -1887,7 +1887,6 @@
#include "code\modules\admin\verbs\randomverbs_vr.dm"
#include "code\modules\admin\verbs\resize.dm"
#include "code\modules\admin\verbs\smite.dm"
-#include "code\modules\admin\verbs\smite_vr.dm"
#include "code\modules\admin\verbs\striketeam.dm"
#include "code\modules\admin\verbs\tripAI.dm"
#include "code\modules\admin\verbs\SDQL2\SDQL_2.dm"