diff --git a/code/datums/autolathe/medical_vr.dm b/code/datums/autolathe/medical_vr.dm
index f59df10466..bfaeb3a63b 100644
--- a/code/datums/autolathe/medical_vr.dm
+++ b/code/datums/autolathe/medical_vr.dm
@@ -1,8 +1,9 @@
/datum/category_item/autolathe/medical/autoinjector
name = "empty autoinjector"
path =/obj/item/weapon/reagent_containers/hypospray/autoinjector/empty
+ resources = list(MAT_PLASTIC = 10) //for recycling purposes mostly
/datum/category_item/autolathe/medical/autoinjector/biginjector
name = "empty large autoinjector"
path =/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/empty
- resources = list(MAT_PLASTIC = 2000)
\ No newline at end of file
+ resources = list(MAT_PLASTIC = 500)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 2e508d8717..9e82b6f434 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -159,16 +159,12 @@
/obj/item/weapon/cell, //this is a bigger belt, might as well make it hold bigger cells too
/obj/item/weapon/pipe_dispenser, //bigger belt for bigger tools
/obj/item/weapon/rcd, //see above
-<<<<<<< HEAD
- /obj/item/device/quantum_pad_booster
-=======
/obj/item/device/quantum_pad_booster,
/obj/item/weapon/inducer,
/obj/item/stack/material/steel,
/obj/item/stack/material/glass,
/obj/item/device/lightreplacer,
/obj/item/weapon/pickaxe/plasmacutter
->>>>>>> 22a34d927bf... Merge pull request #12029 from PastelPrinceDan/beltstufftake2
)
@@ -533,4 +529,4 @@
name = "ranger belt"
desc = "The fancy utility-belt holding the tools, cuffs and gadgets of the Go Go ERT-Rangers. The belt buckle is not real phoron, but it is still surprisingly comfortable to wear."
icon = 'icons/obj/clothing/ranger.dmi'
- icon_state = "ranger_belt"
\ No newline at end of file
+ icon_state = "ranger_belt"
diff --git a/code/modules/clothing/spacesuits/rig/modules/specific/passive_protection.dm b/code/modules/clothing/spacesuits/rig/modules/specific/passive_protection.dm
index 92dcd87dd3..c27e0d9ce3 100644
--- a/code/modules/clothing/spacesuits/rig/modules/specific/passive_protection.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/specific/passive_protection.dm
@@ -73,7 +73,7 @@
/obj/item/rig_module/rad_shield/advanced
name = "advanced radiation absorption device"
- desc = "The acronym of this device - R.A.D. - and its full name both convey the application of the module. It has additional quality notices \
+ desc = "The acronym of this device - R.A.D. - and its full name both convey the application of the module. It has a changelog inscribed \
on the underside of the casing."
use_power_cost = 5
active_power_cost = 5
diff --git a/code/modules/mob/living/simple_mob/combat.dm b/code/modules/mob/living/simple_mob/combat.dm
index b38317b964..3ff7eb5b2d 100644
--- a/code/modules/mob/living/simple_mob/combat.dm
+++ b/code/modules/mob/living/simple_mob/combat.dm
@@ -86,6 +86,10 @@
//The actual top-level ranged attack proc
/mob/living/simple_mob/proc/shoot_target(atom/A)
set waitfor = FALSE
+
+ if(!istype(A) || QDELETED(A))
+ return
+
setClickCooldown(get_attack_speed())
face_atom(A)
diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm
index cf6b2649a8..45c88cbfec 100644
--- a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm
@@ -304,6 +304,10 @@
/mob/living/simple_mob/humanoid/merc/ranged/sniper/shoot_target(atom/A)
set waitfor = FALSE
+
+ if(!istype(A) || QDELETED(A))
+ return
+
setClickCooldown(get_attack_speed())
face_atom(A)
diff --git a/code/modules/mob/new_player/sprite_accessories_ear_ch.dm b/code/modules/mob/new_player/sprite_accessories_ear_ch.dm
index dd62dabb73..ebfadaa147 100644
--- a/code/modules/mob/new_player/sprite_accessories_ear_ch.dm
+++ b/code/modules/mob/new_player/sprite_accessories_ear_ch.dm
@@ -62,4 +62,11 @@
icon_state = "Guilmon_Horns"
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
-
\ No newline at end of file
+
+/datum/sprite_accessory/ears/una_bighorns
+ name = "Unathi Big Horns"
+ icon = 'icons/mob/Human_face_m.dmi'
+ icon_state = "unathi_bighorn"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
diff --git a/code/modules/multiz/ladders_vr.dm b/code/modules/multiz/ladders_vr.dm
deleted file mode 100644
index 6892e2ef12..0000000000
--- a/code/modules/multiz/ladders_vr.dm
+++ /dev/null
@@ -1,122 +0,0 @@
-/obj/structure/portal_subtle
- name = "portal"
- desc = "Looks unstable. Best to test it with the clown."
- icon = 'icons/obj/stationobjs.dmi'
- icon_state = "portal"
- density = TRUE
- unacidable = TRUE//Can't destroy energy portals.
- var/failchance = 0
- anchored = TRUE
- var/obj/structure/portal_subtle/target
-
-/obj/structure/portal_subtle/Destroy()
- if(target)
- target.target = null
- target = null
- return ..()
-
-/obj/structure/portal_subtle/Bumped(mob/M as mob|obj)
- if(istype(M,/mob) && !(istype(M,/mob/living)))
- return //do not send ghosts, zshadows, ai eyes, etc
- spawn(0)
- src.teleport(M)
- return
- return
-
-/obj/structure/portal_subtle/Crossed(AM as mob|obj)
- if(istype(AM,/mob) && !(istype(AM,/mob/living)))
- return //do not send ghosts, zshadows, ai eyes, etc
- spawn(0)
- src.teleport(AM)
- return
- return
-
-/obj/structure/portal_subtle/attack_hand(mob/user as mob)
- if(istype(user) && !(istype(user,/mob/living)))
- return //do not send ghosts, zshadows, ai eyes, etc
- spawn(0)
- src.teleport(user)
- return
- return
-
-/obj/structure/portal_subtle/proc/teleport(atom/movable/M as mob|obj)
- if(istype(M, /obj/effect)) //sparks don't teleport
- return
- if (M.anchored&&istype(M, /obj/mecha))
- return
- if (icon_state == "portal1")
- return
- if (!( target ))
- qdel(src)
- return
- if (istype(target, /obj/structure/portal_subtle))
- qdel(src)
- return
- if (istype(M, /atom/movable))
- if(prob(failchance)) //oh dear a problem, put em in deep space
- src.icon_state = "portal1"
- do_noeffect_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), 3), 0)
- else
- do_noeffect_teleport(M, target, 0) ///You will appear on the beacon
-
-/obj/structure/portal_gateway
- name = "portal"
- desc = "Looks unstable. Best to test it with the clown."
- icon = 'icons/obj/stationobjs_vr.dmi'
- icon_state = "portalgateway"
- density = TRUE
- unacidable = TRUE//Can't destroy energy portals.
- anchored = TRUE
-
-/obj/structure/portal_gateway/Bumped(mob/M as mob|obj)
- if(istype(M,/mob) && !(istype(M,/mob/living)))
- return //do not send ghosts, zshadows, ai eyes, etc
- var/obj/effect/landmark/dest = pick(eventdestinations)
- if(dest)
- M << 'sound/effects/phasein.ogg'
- playsound(src, 'sound/effects/phasein.ogg', 100, 1)
- M.forceMove(dest.loc)
- if(istype(M, /mob/living) && dest.abductor)
- var/mob/living/L = M
- //Situations to get the mob out of
- if(L.buckled)
- L.buckled.unbuckle_mob()
- if(istype(L.loc,/obj/mecha))
- var/obj/mecha/ME = L.loc
- ME.go_out()
- else if(istype(L.loc,/obj/machinery/sleeper))
- var/obj/machinery/sleeper/SL = L.loc
- SL.go_out()
- else if(istype(L.loc,/obj/machinery/recharge_station))
- var/obj/machinery/recharge_station/RS = L.loc
- RS.go_out()
- if(!issilicon(L)) //Don't drop borg modules...
- var/list/mob_contents = list() //Things which are actually drained as a result of the above not being null.
- mob_contents |= L // The recursive check below does not add the object being checked to its list.
- mob_contents |= recursive_content_check(L, mob_contents, recursion_limit = 3, client_check = 0, sight_check = 0, include_mobs = 1, include_objects = 1, ignore_show_messages = 1)
- for(var/obj/item/weapon/holder/I in mob_contents)
- var/obj/item/weapon/holder/H = I
- var/mob/living/MI = H.held_mob
- MI.forceMove(get_turf(H))
- if(!issilicon(MI)) //Don't drop borg modules...
- for(var/obj/item/II in MI)
- if(istype(II,/obj/item/weapon/implant) || istype(II,/obj/item/device/nif))
- continue
- MI.drop_from_inventory(II, dest.loc)
- var/obj/effect/landmark/finaldest = pick(awayabductors)
- MI.forceMove(finaldest.loc)
- sleep(1)
- MI.Paralyse(10)
- MI << 'sound/effects/bamf.ogg'
- to_chat(MI,"You're starting to come to. You feel like you've been out for a few minutes, at least...")
- for(var/obj/item/I in L)
- if(istype(I,/obj/item/weapon/implant) || istype(I,/obj/item/device/nif))
- continue
- L.drop_from_inventory(I, dest.loc)
- var/obj/effect/landmark/finaldest = pick(awayabductors)
- L.forceMove(finaldest.loc)
- sleep(1)
- L.Paralyse(10)
- L << 'sound/effects/bamf.ogg'
- to_chat(L,"You're starting to come to. You feel like you've been out for a few minutes, at least...")
- return
diff --git a/code/modules/multiz/portals_vr.dm b/code/modules/multiz/portals_vr.dm
new file mode 100644
index 0000000000..443134c4dd
--- /dev/null
+++ b/code/modules/multiz/portals_vr.dm
@@ -0,0 +1,227 @@
+/obj/structure/portal_event
+ name = "portal"
+ desc = "It leads to someplace else!"
+ icon = 'icons/obj/stationobjs_vr.dmi'
+ icon_state = "type-d-portal"
+ density = TRUE
+ unacidable = TRUE//Can't destroy energy portals.
+ var/failchance = 0
+ anchored = TRUE
+ var/obj/structure/portal_event/target
+
+/obj/structure/portal_event/Destroy()
+ if(target)
+ target.target = null
+ target = null
+ return ..()
+
+/obj/structure/portal_event/Bumped(mob/M as mob|obj)
+ if(istype(M,/mob) && !(istype(M,/mob/living)))
+ return //do not send ghosts, zshadows, ai eyes, etc
+ spawn(0)
+ src.teleport(M)
+ return
+ return
+
+/obj/structure/portal_event/Crossed(AM as mob|obj)
+ if(istype(AM,/mob) && !(istype(AM,/mob/living)))
+ return //do not send ghosts, zshadows, ai eyes, etc
+ spawn(0)
+ src.teleport(AM)
+ return
+ return
+
+/obj/structure/portal_event/attack_hand(mob/user as mob)
+ if(!istype(user))
+ return
+ if(!target)
+ if(isliving(user))
+ to_chat(user, "Your hand scatters \the [src]...")
+ qdel(src) //Delete portals which aren't set that people mess with.
+ else return //do not send ghosts, zshadows, ai eyes, etc
+ else if(isliving(user) || istype(user, /mob/observer/dead) && user?.client?.holder) //unless they're staff
+ spawn(0)
+ src.teleport(user)
+
+/obj/structure/portal_event/attack_ghost(var/mob/observer/dead/user)
+ if(!target && user?.client?.holder)
+ to_chat(user, "Selecting 'Portal Here' will create and link a portal at your location, while 'Target Here' will create an object that is only visible to ghosts which will act as the target, again at your location. Each option will give you the ability to change portal types, but for all options except 'Select Type' you only get one shot at it, so be sure to experiment with 'Select Type' first if you're not familiar with them.")
+ var/response = tgui_alert(user, "You appear to be staff. This portal has no exit point. If you want to make one, move to where you want it to go, and click the appropriate option, see chat for more info, otherwise click 'Cancel'", "Unbound Portal", list("Cancel","Portal Here","Target Here", "Select Type"))
+ if(response == "Portal Here")
+ target = new type(get_turf(user), src)
+ target.target = src
+ target.icon_state = icon_state
+ var/letsportal = tgui_alert(user, "Would you like to select a different portal type for these portals?", "Change portal", list("No","Yes"))
+ if(letsportal == "Yes")
+ var/portal_icon_selection = select_portal_subtype(user)
+ icon_state = portal_icon_selection
+ target.icon_state = portal_icon_selection
+ if(response == "Target Here")
+ var/obj/structure/portal_target/newtarg = new(get_turf(user))
+ target = newtarg
+ newtarg.target = src
+ var/letsportal = tgui_alert(user, "Would you like to select a different portal type?", "Change portal", list("No","Yes"))
+ if(letsportal == "Yes")
+ user.forceMove(src)
+ icon_state = select_portal_subtype(user)
+ if(response == "Select Type")
+ icon_state = select_portal_subtype(user)
+ return
+ message_admins("The [src]([x],[y],[z]) was given [target]([target.x],[target.y],[target.z]) as a target, and should be ready to use.")
+ else if(user?.client?.holder)
+ src.teleport(user)
+ else return
+
+/obj/structure/portal_event/proc/select_portal_subtype(user)
+ var/portal_type = tgui_alert(user, "What kind of portal would you like it to be?", "Type Selection", list("Tech (Default)","Star","Weird Green","Pulsing"))
+ var/portal_icon_selection = "type-d-portal"
+ if(portal_type == "Tech (Default)")
+ portal_icon_selection = "type-d-portal"
+ if(portal_type == "Star")
+ var/portal_subtype = tgui_alert(user, "Which subtype would you prefer?", "Subtype Selection", list("Blue","Blue Pulse","Blue Unstable","Red","Red Unstable"))
+ if(portal_subtype == "Blue")
+ portal_icon_selection = "type-a-blue-portal"
+ if(portal_subtype == "Blue Pulse")
+ portal_icon_selection = "type-a-blue-portal-b"
+ if(portal_subtype == "Blue Unstable")
+ portal_icon_selection = "type-a-blue-portal-c"
+ if(portal_subtype == "Red")
+ portal_icon_selection = "type-a-red-portal"
+ if(portal_subtype == "Red Unstable")
+ portal_icon_selection = "type-a-red-portal-b"
+ if(portal_type == "Weird Green")
+ portal_icon_selection = "type-b-portal"
+ if(portal_type == "Pulsing")
+ var/portal_subtype = tgui_alert(user, "Which subtype would you prefer?", "Subtype Selection", list("Blue","Red","Blue/Red Mix", "Yellow"))
+ if(portal_subtype == "Blue")
+ portal_icon_selection = "type-c-blue-portal"
+ if(portal_subtype == "Red")
+ portal_icon_selection = "type-c-red-portal"
+ if(portal_subtype == "Blue/Red Mix")
+ portal_icon_selection = "type-c-mix-portal"
+ if(portal_subtype == "Yellow")
+ portal_icon_selection = "type-c-yellow-portal"
+ return portal_icon_selection
+
+/obj/structure/portal_event/proc/teleport(atom/movable/M as mob|obj)
+ if(istype(M, /obj/effect)) //sparks don't teleport
+ return
+ if (M.anchored&&istype(M, /obj/mecha))
+ return
+ if (!target)
+ to_chat(M, "\The [src] scatters as you pass through it...")
+ qdel(src)
+ return
+ if (!istype(M, /atom/movable))
+ return
+ var/turf/place
+ if(isturf(target))
+ place = src
+ else
+ place = target.loc
+ var/portalfind = FALSE
+ for(var/obj/structure/S in place.contents)
+ if(istype(S, /obj/structure/portal_event))
+ portalfind = TRUE
+ else if (S.density)
+ portalfind = TRUE
+ var/temptarg
+ if(portalfind)
+ var/possible_turfs = place.AdjacentTurfs()
+ if(isemptylist(possible_turfs))
+ to_chat(M, "Something blocks your way.")
+ return
+ temptarg = pick(possible_turfs)
+ do_noeffect_teleport(M, temptarg, 0)
+ else if (istype(M, /atom/movable))
+ do_noeffect_teleport(M, target, 0)
+
+/obj/structure/portal_event/Destroy()
+ if(target)
+ if(istype(target, /obj/structure/portal_event))
+ var/obj/structure/portal_event/P = target
+ P.target = null
+ if(istype(target, /obj/structure/portal_target))
+ var/obj/structure/portal_target/P = target
+ P.target = null
+ qdel_null(target)
+ . = ..()
+
+/obj/structure/portal_target
+ name = "portal destination"
+ desc = "you shouldn't see this unless you're a ghost"
+ icon = 'icons/obj/stationobjs_vr.dmi'
+ icon_state = "type-b-portal"
+ density = 0
+ alpha = 100
+ invisibility = INVISIBILITY_OBSERVER
+ var/target
+
+/obj/structure/portal_target/Destroy()
+ if(target)
+ var/obj/structure/portal_event/T = target
+ T.target = null
+ target = null
+ . = ..()
+
+/obj/structure/portal_gateway
+ name = "portal"
+ desc = "It leads to someplace else!"
+ icon = 'icons/obj/stationobjs_vr.dmi'
+ icon_state = "portalgateway"
+ density = TRUE
+ unacidable = TRUE//Can't destroy energy portals.
+ anchored = TRUE
+
+/obj/structure/portal_gateway/Bumped(mob/M as mob|obj)
+ if(istype(M,/mob) && !(istype(M,/mob/living)))
+ return //do not send ghosts, zshadows, ai eyes, etc
+ var/obj/effect/landmark/dest = pick(eventdestinations)
+ if(dest)
+ M << 'sound/effects/phasein.ogg'
+ playsound(src, 'sound/effects/phasein.ogg', 100, 1)
+ M.forceMove(dest.loc)
+ if(istype(M, /mob/living) && dest.abductor)
+ var/mob/living/L = M
+ //Situations to get the mob out of
+ if(L.buckled)
+ L.buckled.unbuckle_mob()
+ if(istype(L.loc,/obj/mecha))
+ var/obj/mecha/ME = L.loc
+ ME.go_out()
+ else if(istype(L.loc,/obj/machinery/sleeper))
+ var/obj/machinery/sleeper/SL = L.loc
+ SL.go_out()
+ else if(istype(L.loc,/obj/machinery/recharge_station))
+ var/obj/machinery/recharge_station/RS = L.loc
+ RS.go_out()
+ if(!issilicon(L)) //Don't drop borg modules...
+ var/list/mob_contents = list() //Things which are actually drained as a result of the above not being null.
+ mob_contents |= L // The recursive check below does not add the object being checked to its list.
+ mob_contents |= recursive_content_check(L, mob_contents, recursion_limit = 3, client_check = 0, sight_check = 0, include_mobs = 1, include_objects = 1, ignore_show_messages = 1)
+ for(var/obj/item/weapon/holder/I in mob_contents)
+ var/obj/item/weapon/holder/H = I
+ var/mob/living/MI = H.held_mob
+ MI.forceMove(get_turf(H))
+ if(!issilicon(MI)) //Don't drop borg modules...
+ for(var/obj/item/II in MI)
+ if(istype(II,/obj/item/weapon/implant) || istype(II,/obj/item/device/nif))
+ continue
+ MI.drop_from_inventory(II, dest.loc)
+ var/obj/effect/landmark/finaldest = pick(awayabductors)
+ MI.forceMove(finaldest.loc)
+ sleep(1)
+ MI.Paralyse(10)
+ MI << 'sound/effects/bamf.ogg'
+ to_chat(MI,"You're starting to come to. You feel like you've been out for a few minutes, at least...")
+ for(var/obj/item/I in L)
+ if(istype(I,/obj/item/weapon/implant) || istype(I,/obj/item/device/nif))
+ continue
+ L.drop_from_inventory(I, dest.loc)
+ var/obj/effect/landmark/finaldest = pick(awayabductors)
+ L.forceMove(finaldest.loc)
+ sleep(1)
+ L.Paralyse(10)
+ L << 'sound/effects/bamf.ogg'
+ to_chat(L,"You're starting to come to. You feel like you've been out for a few minutes, at least...")
+ return
diff --git a/code/modules/research/mechfab_designs.dm b/code/modules/research/mechfab_designs.dm
index f63e8c3409..2dcf10ddfd 100644
--- a/code/modules/research/mechfab_designs.dm
+++ b/code/modules/research/mechfab_designs.dm
@@ -1048,6 +1048,30 @@
materials = list(MAT_DURASTEEL = 5000, MAT_GRAPHITE = 3000, MAT_MORPHIUM = 1500, MAT_OSMIUM = 1500, MAT_PHORON = 1750, MAT_VERDANTIUM = 3000, MAT_SUPERMATTER = 2000)
build_path = /obj/item/rig_module/teleporter
+/datum/design/item/mechfab/rigsuit/radshield
+ name = "hardsuit radiation absorption device"
+ desc = "A miniaturized radiation absorption array, for use in hardsuits and providing full radiation protection."
+ id = "rig_component_radshield"
+ req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 3, TECH_MAGNET = 4, TECH_POWER = 3, TECH_BLUESPACE = 4)
+ materials = list(MAT_STEEL = 8000, MAT_GRAPHITE = 3000, MAT_OSMIUM = 1500, MAT_PHORON = 2250, MAT_SILVER = 1500, MAT_GOLD = 1500)
+ build_path = /obj/item/rig_module/rad_shield
+
+/datum/design/item/mechfab/rigsuit/radshield_adv
+ name = "hardsuit advanced radiation absorption device"
+ desc = "An optimized, miniaturized radiation absorption array, for use in hardsuits and providing full radiation protection. Reduced power draw."
+ id = "rig_component_radshield_adv"
+ req_tech = list(TECH_MATERIAL = 7, TECH_ENGINEERING = 5, TECH_MAGNET = 5, TECH_POWER = 6, TECH_BLUESPACE = 4)
+ materials = list(MAT_PLASTEEL = 8000, MAT_GRAPHITE = 4000, MAT_OSMIUM = 2000, MAT_PHORON = 3250, MAT_SILVER = 2250, MAT_GOLD = 2250)
+ build_path = /obj/item/rig_module/rad_shield/advanced
+
+/datum/design/item/mechfab/rigsuit/atmosshield
+ name = "hardsuit atmospheric protection enhancement suite"
+ desc = "An advanced atmospheric protection suite, providing protection against both pressure and heat. At the cost of concerningly high power draw."
+ id = "rig_component_atmosshield"
+ req_tech = list(TECH_MATERIAL = 7, TECH_ENGINEERING = 5, TECH_MAGNET = 5, TECH_POWER = 6, TECH_BLUESPACE = 4)
+ materials = list(MAT_PLASTEEL = 8000, MAT_DURASTEEL = 4000, MAT_GRAPHITE = 8000, MAT_OSMIUM = 6000, MAT_PHORON = 6000, MAT_SILVER = 4000, MAT_GOLD = 4000)
+ build_path = /obj/item/rig_module/atmos_shield
+
/datum/design/item/mechfab/uav/basic
name = "UAV - Recon Skimmer"
id = "recon_skimmer"
diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm
index ec2aead7de..083e12a544 100644
--- a/code/modules/vore/resizing/resize_vr.dm
+++ b/code/modules/vore/resizing/resize_vr.dm
@@ -173,7 +173,7 @@
var/mob/living/simple_mob/SA = M
if(!SA.has_hands)
return 0
- if(size_diff >= 0.50 || mob_size < MOB_SMALL)
+ if(size_diff >= 0.50 || mob_size < MOB_SMALL || size_diff >= get_effective_size())
if(buckled)
to_chat(usr,"You have to unbuckle \the [src] before you pick them up.")
return 0
diff --git a/icons/obj/stationobjs_vr.dmi b/icons/obj/stationobjs_vr.dmi
index 74732a334a..e3c9c446ac 100644
Binary files a/icons/obj/stationobjs_vr.dmi and b/icons/obj/stationobjs_vr.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index 584825b89b..80cff27f2d 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -3471,11 +3471,11 @@
#include "code\modules\multiz\hoist.dm"
#include "code\modules\multiz\ladder_assembly_vr.dm"
#include "code\modules\multiz\ladders.dm"
-#include "code\modules\multiz\ladders_vr.dm"
#include "code\modules\multiz\misc.dm"
#include "code\modules\multiz\movement.dm"
#include "code\modules\multiz\movement_vr.dm"
#include "code\modules\multiz\pipes.dm"
+#include "code\modules\multiz\portals_vr.dm"
#include "code\modules\multiz\stairs.dm"
#include "code\modules\multiz\turf.dm"
#include "code\modules\multiz\turf_yw.dm"