diff --git a/code/__defines/misc_vr.dm b/code/__defines/misc_vr.dm
index 0465c196a0..75e48a3bb9 100644
--- a/code/__defines/misc_vr.dm
+++ b/code/__defines/misc_vr.dm
@@ -65,4 +65,14 @@
#define MAT_PLASTITANIUM "plastitanium"
#define MAT_PLASTITANIUMHULL "plastitanium hull"
#define MAT_PLASTITANIUMGLASS "plastitanium glass"
-#define MAT_GOLDHULL "gold hull"
\ No newline at end of file
+#define MAT_GOLDHULL "gold hull"
+
+#define RESIZE_HUGE 2
+#define RESIZE_BIG 1.5
+#define RESIZE_NORMAL 1
+#define RESIZE_SMALL 0.5
+#define RESIZE_TINY 0.25
+#define RESIZE_A_HUGEBIG (RESIZE_HUGE + RESIZE_BIG) / 2
+#define RESIZE_A_BIGNORMAL (RESIZE_BIG + RESIZE_NORMAL) / 2
+#define RESIZE_A_NORMALSMALL (RESIZE_NORMAL + RESIZE_SMALL) / 2
+#define RESIZE_A_SMALLTINY (RESIZE_SMALL + RESIZE_TINY) / 2
\ No newline at end of file
diff --git a/code/game/area/Space Station 13 areas_vr.dm b/code/game/area/Space Station 13 areas_vr.dm
index cdc5ffe96c..c56c21a7b5 100644
--- a/code/game/area/Space Station 13 areas_vr.dm
+++ b/code/game/area/Space Station 13 areas_vr.dm
@@ -1,4 +1,6 @@
//TFF 28/8/19 - cleanup of areas placement - removes all but rogueminer_vr stuff.
+/area
+ var/limit_mob_size = TRUE //If mob size is limited in the area.
/area/shuttle/belter
name = "Belter Shuttle"
diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm
index d250c441ad..9fc924dae8 100644
--- a/code/game/dna/dna2_helpers.dm
+++ b/code/game/dna/dna2_helpers.dm
@@ -222,7 +222,7 @@
// Playerscale
var/size = dna.GetUIValueRange(DNA_UI_PLAYERSCALE, player_sizes_list.len)
if((0 < size) && (size <= player_sizes_list.len))
- H.resize(player_sizes_list[player_sizes_list[size]], FALSE)
+ H.resize(player_sizes_list[player_sizes_list[size]], TRUE)
// Tail/Taur Color
H.r_tail = dna.GetUIValueRange(DNA_UI_TAIL_R, 255)
diff --git a/code/modules/admin/admin_verb_lists_vr.dm b/code/modules/admin/admin_verb_lists_vr.dm
index bc6e620b7a..597c229478 100644
--- a/code/modules/admin/admin_verb_lists_vr.dm
+++ b/code/modules/admin/admin_verb_lists_vr.dm
@@ -155,6 +155,7 @@ var/list/admin_verbs_fun = list(
/client/proc/smite,
/client/proc/smite_vr, //VOREStation Add,
/client/proc/admin_lightning_strike,
+ /client/proc/resize //VOREStation Add,
)
var/list/admin_verbs_spawn = list(
diff --git a/code/modules/admin/verbs/resize.dm b/code/modules/admin/verbs/resize.dm
new file mode 100644
index 0000000000..dddaeb9ec1
--- /dev/null
+++ b/code/modules/admin/verbs/resize.dm
@@ -0,0 +1,16 @@
+/client/proc/resize(var/mob/living/L in mob_list)
+ set name = "Resize"
+ set desc = "Resizes any living mob without any restrictions on size."
+ set category = "Fun"
+ if(!check_rights(R_ADMIN, R_FUN))
+ return
+
+ var/size_multiplier = input(usr, "Input size multiplier.", "Resize", 1)
+ L.resize(size_multiplier, TRUE, TRUE)
+ if(size_multiplier >= RESIZE_TINY && size_multiplier <= RESIZE_HUGE)
+ L.size_uncapped = FALSE
+ else
+ L.size_uncapped = TRUE
+
+ log_and_message_admins("has changed [key_name(L)]'s size multiplier to [size_multiplier].")
+ feedback_add_details("admin_verb","RESIZE")
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human_defines_vr.dm b/code/modules/mob/living/carbon/human/human_defines_vr.dm
index 0ac1b641d3..de940a81df 100644
--- a/code/modules/mob/living/carbon/human/human_defines_vr.dm
+++ b/code/modules/mob/living/carbon/human/human_defines_vr.dm
@@ -7,7 +7,6 @@
var/impersonate_bodytype //For impersonating a bodytype
var/ability_flags = 0 //Shadekin abilities/potentially other species-based?
var/sensorpref = 5 //Suit sensor loadout pref
- var/unnaturally_resized = FALSE //If one became larger than 200%, or smaller than 25%. This flag is needed for the case when admins want someone to be very big or very small outside of dorms.
var/wings_hidden = FALSE
var/nutrition_hidden = FALSE // Chomp Edit
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 2aa278df11..8db144a381 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -62,8 +62,6 @@
//No need to update all of these procs if the guy is dead.
fall() //VORESTATION EDIT. Prevents people from floating
- if(unnaturally_resized) //VORESTATION EDIT.
- handle_unnatural_size()
if(stat != DEAD && !stasis)
//Updates the number of stored chemicals for powers
handle_changeling()
diff --git a/code/modules/mob/living/carbon/human/life_vr.dm b/code/modules/mob/living/carbon/human/life_vr.dm
index 2440a1ab74..c5248fc862 100644
--- a/code/modules/mob/living/carbon/human/life_vr.dm
+++ b/code/modules/mob/living/carbon/human/life_vr.dm
@@ -78,10 +78,3 @@
// Moving around increases germ_level faster
if(germ_level < GERM_LEVEL_MOVE_CAP && prob(8))
germ_level++
-
-/mob/living/carbon/human/proc/handle_unnatural_size()
- if(!in_dorms())
- if(src.size_multiplier > 2)
- src.resize(2)
- else if (src.size_multiplier < 0.25)
- src.resize(0.25)
\ No newline at end of file
diff --git a/code/modules/mob/living/living_defines_vr.dm b/code/modules/mob/living/living_defines_vr.dm
index 648ea8aa49..6964193c5c 100644
--- a/code/modules/mob/living/living_defines_vr.dm
+++ b/code/modules/mob/living/living_defines_vr.dm
@@ -6,6 +6,7 @@
appearance_flags = TILE_BOUND|PIXEL_SCALE|KEEP_TOGETHER
var/hunger_rate = DEFAULT_HUNGER_FACTOR
var/resizable = TRUE
+ var/size_uncapped = FALSE //Determines if a mob's size obedies the resize cap, used for adminbus resize.
//custom say verbs
var/custom_say = null
diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm
index 703706483f..f726775207 100644
--- a/code/modules/vore/resizing/resize_vr.dm
+++ b/code/modules/vore/resizing/resize_vr.dm
@@ -1,16 +1,5 @@
-
-//these aren't defines so they can stay in this file
-var/const/RESIZE_HUGE = 2
-var/const/RESIZE_BIG = 1.5
-var/const/RESIZE_NORMAL = 1
-var/const/RESIZE_SMALL = 0.5
-var/const/RESIZE_TINY = 0.25
-
-//average
-var/const/RESIZE_A_HUGEBIG = (RESIZE_HUGE + RESIZE_BIG) / 2
-var/const/RESIZE_A_BIGNORMAL = (RESIZE_BIG + RESIZE_NORMAL) / 2
-var/const/RESIZE_A_NORMALSMALL = (RESIZE_NORMAL + RESIZE_SMALL) / 2
-var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
+GLOBAL_LIST_EMPTY(size_uncapped_mobs)
+GLOBAL_VAR(size_uncapped_mobs_timer)
// Adding needed defines to /mob/living
// Note: Polaris had this on /mob/living/carbon/human We need it higher up for animals and stuff.
@@ -64,28 +53,58 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
* Resizes the mob immediately to the desired mod, animating it growing/shrinking.
* It can be used by anything that calls it.
*/
-/atom/movable/proc/in_dorms()
- var/area/A = get_area(src)
- return istype(A, /area/crew_quarters/sleep)
/atom/movable/proc/size_range_check(size_select) //both objects and mobs needs to have that
- if((!in_dorms() && (size_select > 200 || size_select < 25)) || (size_select > 600 || size_select <1))
+ var/area/A = get_area(src) //Get the atom's area to check for size limit.
+ if((A.limit_mob_size && (size_select > 200 || size_select < 25)) || (size_select > 600 || size_select <1))
return FALSE
return TRUE
-/mob/living/proc/resize(var/new_size, var/animate = TRUE, var/mark_unnatural_size = TRUE)
+/proc/add_to_uncapped_list(var/mob/living/L)
+ if(L.size_uncapped)
+ return
+ if(!GLOB.size_uncapped_mobs.len)
+ GLOB.size_uncapped_mobs_timer = addtimer(CALLBACK(GLOBAL_PROC, .check_uncapped_list), 2 SECONDS, TIMER_LOOP | TIMER_UNIQUE | TIMER_STOPPABLE)
+ GLOB.size_uncapped_mobs |= weakref(L)
+
+/proc/remove_from_uncapped_list(var/mob/living/L)
+ if(!GLOB.size_uncapped_mobs.len)
+ return
+
+ GLOB.size_uncapped_mobs -= weakref(L)
+
+ if(!GLOB.size_uncapped_mobs.len)
+ deltimer(GLOB.size_uncapped_mobs_timer)
+ GLOB.size_uncapped_mobs_timer = null
+
+/proc/check_uncapped_list()
+ for(var/weakref/wr in GLOB.size_uncapped_mobs)
+ var/mob/living/L = wr.resolve()
+ var/area/A = get_area(L)
+ if(!istype(L))
+ GLOB.size_uncapped_mobs -= wr
+ continue
+
+ if((A.limit_mob_size && !L.size_uncapped) && (L.size_multiplier <= RESIZE_TINY || L.size_multiplier >= RESIZE_HUGE))
+ L.resize(L.size_multiplier)
+ GLOB.size_uncapped_mobs -= wr
+
+ if(!GLOB.size_uncapped_mobs.len)
+ deltimer(GLOB.size_uncapped_mobs_timer)
+ GLOB.size_uncapped_mobs_timer = null
+
+/mob/living/proc/resize(var/new_size, var/animate = TRUE, var/uncapped = FALSE)
+ if(!uncapped)
+ new_size = clamp(new_size, RESIZE_TINY, RESIZE_HUGE)
+ src.size_uncapped = FALSE
+ remove_from_uncapped_list(src)
+ else
+ add_to_uncapped_list(src)
if(size_multiplier == new_size)
return 1
size_multiplier = new_size //Change size_multiplier so that other items can interact with them
- if(ishuman(src))
- var/mob/living/carbon/human/H = src
- if(new_size > 2 || new_size < 0.25)
- if(mark_unnatural_size) //Will target size be reverted to ordinary bounds when out of dorms or not?
- H.unnaturally_resized = TRUE
- else
- H.unnaturally_resized = FALSE
if(animate)
var/change = new_size - size_multiplier
var/duration = (abs(change)+0.25) SECONDS
diff --git a/code/modules/vore/resizing/sizegun_vr.dm b/code/modules/vore/resizing/sizegun_vr.dm
index e30c218fbb..d042c6cb34 100644
--- a/code/modules/vore/resizing/sizegun_vr.dm
+++ b/code/modules/vore/resizing/sizegun_vr.dm
@@ -89,12 +89,8 @@
/obj/item/projectile/beam/sizelaser/on_hit(var/atom/target)
var/mob/living/M = target
if(istype(M))
- if(!M.in_dorms() || !istype(M, /mob/living/carbon/human))
- if(!M.resize(clamp(set_size,0.25,2)))
- to_chat(M, "The beam fires into your body, changing your size!")
- else
- if(!M.resize(clamp(set_size,0.01,6)))
- to_chat(M, "The beam fires into your body, changing your size!")
+ if(!M.resize(set_size))
+ to_chat(M, "The beam fires into your body, changing your size!")
M.updateicon()
return
return 1
@@ -102,7 +98,10 @@
/obj/item/projectile/beam/sizelaser/admin/on_hit(var/atom/target)
var/mob/living/M = target
if(istype(M))
- M.resize(set_size, TRUE, FALSE)
+ M.resize(set_size, TRUE, TRUE)
+ if(set_size >= RESIZE_TINY && set_size <= RESIZE_HUGE)
+ M.size_uncapped = FALSE
+ M.size_uncapped = TRUE
to_chat(M, "The beam fires into your body, changing your size!")
M.updateicon()
return
diff --git a/maps/tether/tether_areas.dm b/maps/tether/tether_areas.dm
index d6e4727b5e..83967857d3 100644
--- a/maps/tether/tether_areas.dm
+++ b/maps/tether/tether_areas.dm
@@ -979,6 +979,9 @@
icon_state = "recreation_area_restroom"
sound_env = SMALL_ENCLOSED
+/area/crew_quarters/sleep
+ limit_mob_size = FALSE
+
/area/crew_quarters/sleep/maintDorm1
name = "\improper Construction Dorm 1"
icon_state = "Sleep"
@@ -1141,6 +1144,9 @@
flags = RAD_SHIELDED | BLUE_SHIELDED
soundproofed = TRUE
+/area/holodeck/holodorm
+ limit_mob_size = FALSE
+
/area/holodeck/holodorm/source_basic
name = "\improper Holodeck Source"
flags = RAD_SHIELDED | BLUE_SHIELDED
@@ -1537,6 +1543,7 @@ area/shuttle/mining_outpost/shuttle
requires_power = 0
flags = RAD_SHIELDED
icon_state = "red2"
+ limit_mob_size = FALSE
/area/unknown/dorm1
name = "Unknown Dorm 1"
diff --git a/vorestation.dme b/vorestation.dme
index 56cd450508..9c834a5c0e 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -1790,6 +1790,7 @@
#include "code\modules\admin\verbs\pray.dm"
#include "code\modules\admin\verbs\randomverbs.dm"
#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"