diff --git a/code/__DEFINES/storage.dm b/code/__DEFINES/storage.dm
index 3ec3e06961..bdcb638666 100644
--- a/code/__DEFINES/storage.dm
+++ b/code/__DEFINES/storage.dm
@@ -1,12 +1,17 @@
// storage_flags variable on /datum/component/storage
-// Storage limits. These can be combined I guess but you really, really shouldn't (don't do it really)
+// Storage limits. These can be combined (and usually are combined).
/// Check max_items and contents.len when trying to insert
#define STORAGE_LIMIT_MAX_ITEMS (1<<0)
-/// Check w_class and max_combined_w_class, aka legacy behavior if you combine it with [STORAGE_LIMIT_MAX_ITEMS].
+/// Check max_combined_w_class.
#define STORAGE_LIMIT_COMBINED_W_CLASS (1<<1)
-/// Use max_w_class for maximum w_class but use the new volume system. Will automatically force rendering to use the new volume/baystation scaling UI so this is kind of incompatible with stuff like stack storage etc etc.
+/// Use the new volume system. Will automatically force rendering to use the new volume/baystation scaling UI so this is kind of incompatible with stuff like stack storage etc etc.
#define STORAGE_LIMIT_VOLUME (1<<2)
+/// Use max_w_class
+#define STORAGE_LIMIT_MAX_W_CLASS (1<<3)
+
+#define STORAGE_FLAGS_LEGACY_DEFAULT (STORAGE_LIMIT_MAX_ITEMS | STORAGE_LIMIT_COMBINED_W_CLASS | STORAGE_LIMIT_MAX_W_CLASS)
+#define STORAGE_FLAGS_VOLUME_DEFAULT (STORAGE_LIMIT_MAX_ITEMS | STORAGE_LIMIT_VOLUME | STORAGE_LIMIT_MAX_W_CLASS)
//ITEM INVENTORY WEIGHT, FOR w_class
/// Usually items smaller then a human hand, ex: Playing Cards, Lighter, Scalpel, Coins/Money
@@ -28,7 +33,11 @@
#define AUTO_SCALE_STORAGE_VOLUME(w_class, max_combined_w_class) (AUTO_SCALE_VOLUME(w_class) * (max_combined_w_class / w_class))
// UI defines
+/// Size of volumetric box icon
+#define VOLUMETRIC_STORAGE_BOX_ICON_SIZE 32
+/// Size of EACH left/right border icon for volumetric boxes
+#define VOLUMETRIC_STORAGE_BOX_BORDER_SIZE 1
/// Minimum pixels an item must have in volumetric scaled storage UI
-#define MINIMUM_PIXELS_PER_ITEM 2
+#define MINIMUM_PIXELS_PER_ITEM 6
/// Maximum number of objects that will be allowed to be displayed using the volumetric display system. Arbitrary number to prevent server lockups.
#define MAXIMUM_VOLUMETRIC_ITEMS 256
diff --git a/code/_onclick/hud/screen_objects/storage.dm b/code/_onclick/hud/screen_objects/storage.dm
index bf560841bb..5b73d8721a 100644
--- a/code/_onclick/hud/screen_objects/storage.dm
+++ b/code/_onclick/hud/screen_objects/storage.dm
@@ -55,40 +55,52 @@
/obj/screen/storage/volumetric_box
icon_state = "stored_continue"
var/obj/item/our_item
- var/obj/screen/storage/stored_left/left
- var/obj/screen/storage/stored_right/right
-
-/obj/screen/storage/volumetric_box/Destroy()
- QDEL_NULL(left)
- QDEL_NULL(right)
- our_item = null
- return ..()
/obj/screen/storage/volumetric_box/Initialize(mapload, new_master, our_item)
src.our_item = our_item
- left = new(null, src, our_item)
- right = new(null, src, our_item)
+ return ..()
+
+/obj/screen/storage/volumetric_box/Destroy()
+ our_item = null
return ..()
/obj/screen/storage/volumetric_box/Click(location, control, params)
return our_item.Click(location, control, params)
-/obj/screen/storage/volumetric_box/proc/on_screen_objects()
+/obj/screen/storage/volumetric_box/center
+ icon_state = "stored_continue"
+ var/obj/screen/storage/stored_left/left
+ var/obj/screen/storage/stored_right/right
+
+/obj/screen/storage/volumetric_box/center/Initialize(mapload, new_master, our_item)
+ left = new(null, src, our_item)
+ right = new(null, src, our_item)
+ return ..()
+
+/obj/screen/storage/volumetric_box/center/Destroy()
+ QDEL_NULL(lefT)
+ QDEL_NULL(right)
+ return ..()
+
+/obj/screen/storage/volumetric_box/center/proc/on_screen_objects()
return list(src, left, right)
-#define BOX_ICON_PIXELS 32
-/obj/screen/storage/volumetric_box/proc/set_pixel_size(pixels)
+/**
+ * Sets the size of this box screen object and regenerates its left/right borders. This includes the actual border's size!
+ */
+/obj/screen/storage/volumetric_box/center/proc/set_pixel_size(pixels)
cut_overlays()
//our icon size is 32 pixels.
- transform = matrix(pixels / BOX_ICON_PIXELS, 0, 0, 0, 1, 0)
- left.pixel_x = -((BOX_ICON_PIXELS - pixels) * 0.5) - 4
- right.pixel_x = ((BOX_ICON_PIXELS - pixels) * 0.5) + 4
+ transform = matrix((pixels - (VOLUMETRIC_STORAGE_BOX_BORDER_SIZE * 2)) / VOLUMETRIC_STORAGE_BOX_ICON_SIZE, 0, 0, 0, 1, 0)
+ left.pixel_x = -((pixels - VOLUMETRIC_STORAGE_BOX_ICON_SIZE) * 0.5) - VOLUMETRIC_STORAGE_BOX_BORDER_SIZE
+ right.pixel_x = ((pixels - VOLUMETRIC_STORAGE_BOX_ICON_SIZE) * 0.5) + VOLUMETRIC_STORAGE_BOX_BORDER_SIZE
add_overlay(left)
add_overlay(right)
-#undef BOX_ICON_PIXELS
/obj/screen/storage/stored_left
icon_state = "stored_start"
+ appearance_flags = APPEARANCE_UI | KEEP_APART | RESET_TRANSFORM // Yes I know RESET_TRANSFORM is in APPEARANCE_UI but we're hard-asserting this incase someone changes it.
/obj/screen/storage/stored_right
icon_state = "stored_end"
+ appearance_flags = APPEARANCE_UI | KEEP_APART | RESET_TRANSFORM
diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm
index 25646598d3..7cf820239c 100644
--- a/code/datums/components/storage/storage.dm
+++ b/code/datums/components/storage/storage.dm
@@ -22,7 +22,7 @@
var/locked = FALSE //when locked nothing can see inside or use it.
/// Storage flags, including what kinds of limiters we use for how many items we can hold
- var/storage_flags = STORAGE_LIMIT_VOLUME
+ var/storage_flags = STORAGE_FLAGS_VOLUME_DEFAULT
/// Max w_class we can hold. Applies to [STORAGE_LIMIT_COMBINED_W_CLASS] and [STORAGE_LIMIT_VOLUME]
var/max_w_class = WEIGHT_CLASS_SMALL
/// Max combined w_class. Applies to [STORAGE_LIMIT_COMBINED_W_CLASS]
@@ -496,10 +496,6 @@
if(M && !stop_messages)
host.add_fingerprint(M)
return FALSE
- if(real_location.contents.len >= max_items)
- if(!stop_messages)
- to_chat(M, "[host] is full, make some space!")
- return FALSE //Storage item is full
if(length(can_hold))
if(!is_type_in_typecache(I, can_hold))
if(!stop_messages)
@@ -509,17 +505,34 @@
if(!stop_messages)
to_chat(M, "[host] cannot hold [I]!")
return FALSE
- if(I.w_class > max_w_class)
- if(!stop_messages)
- to_chat(M, "[I] is too big for [host]!")
- return FALSE
- var/sum_w_class = I.w_class
- for(var/obj/item/_I in real_location)
- sum_w_class += _I.w_class //Adds up the combined w_classes which will be in the storage item if the item is added to it.
- if(sum_w_class > max_combined_w_class)
- if(!stop_messages)
- to_chat(M, "[I] won't fit in [host], make some space!")
- return FALSE
+ // STORAGE LIMITS
+ if(storage_flags & STORAGE_LIMIT_MAX_ITEMS)
+ if(real_location.contents.len >= max_items)
+ if(!stop_messages)
+ to_chat(M, "[host] has too many things in it, make some space!")
+ return FALSE //Storage item is full
+ if(storage_flags & STORAGE_LIMIT_MAX_W_CLASS)
+ if(I.w_class > max_w_class)
+ if(!stop_messages)
+ to_chat(M, "[I] is too long for [host]!")
+ return FALSE
+ if(storage_flags & STORAGE_LIMIT_COMBINED_W_CLASS)
+ var/sum_w_class = I.w_class
+ for(var/obj/item/_I in real_location)
+ sum_w_class += _I.w_class //Adds up the combined w_classes which will be in the storage item if the item is added to it.
+ if(sum_w_class > max_combined_w_class)
+ if(!stop_messages)
+ to_chat(M, "[I] won't fit in [host], make some space!")
+ return FALSE
+ if(storage_flags & STORAGE_LIMIT_VOLUME)
+ var/sum_volume = I.get_w_volume()
+ for(var/obj/item/_I in real_location)
+ sum_volume += _I.get_w_volume()
+ if(sum_volume > get_max_volume())
+ if(!stop_messages)
+ to_chat(M, "[I] is too spacious to fit in [host], make some space!")
+ return FALSE
+ /////////////////
if(isitem(host))
var/obj/item/IP = host
var/datum/component/storage/STR_I = I.GetComponent(/datum/component/storage)
diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi
index d00d0b079c..60c413c372 100644
Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ