Part 1: Storage Improvements (#90365)

## About The Pull Request
- Removed duplicate definition of
`/obj/item/storage/contents_explosion()`
- Removed var `rummage_if_nodrop`. It's always `TRUE` and nowhere in
game is it modified so we implement its value directly
- Autodoc for procs `PopulateContents()` & `emptyStorage()`
- Deconstructing storages is faster as it drops the contents directly on
the turf instead of refreshing views, animating parent, updating
appearance & other stuff done in `removeAll()`. It also has no side
effects as presently indestructible contents is moved to the turf inside
`Destroy()`

## Changelog
🆑
code: improved storage code
/🆑
This commit is contained in:
SyncIt21
2025-04-07 10:49:57 +02:00
committed by GitHub
parent dc53bcf584
commit aee65d742d
2 changed files with 51 additions and 57 deletions
+39 -48
View File
@@ -2,9 +2,8 @@
name = "storage"
icon = 'icons/obj/storage/storage.dmi'
w_class = WEIGHT_CLASS_NORMAL
interaction_flags_click = ALLOW_RESTING|FORBID_TELEKINESIS_REACH
interaction_flags_click = ALLOW_RESTING | FORBID_TELEKINESIS_REACH
action_slots = ALL
var/rummage_if_nodrop = TRUE
/// Should we preload the contents of this type?
/// BE CAREFUL, THERE'S SOME REALLY NASTY SHIT IN THIS TYPEPATH
/// SANTA IS EVIL
@@ -12,35 +11,6 @@
/// What storage type to use for this item
var/datum/storage/storage_type = /datum/storage
/obj/item/storage/apply_fantasy_bonuses(bonus)
. = ..()
if(isnull(atom_storage)) // some abstract types of storage (yes i know) don't get a datum
return
atom_storage.max_slots = modify_fantasy_variable("max_slots", atom_storage.max_slots, round(bonus/2))
atom_storage.max_total_storage = modify_fantasy_variable("max_total_storage", atom_storage.max_total_storage, round(bonus/2))
LAZYSET(fantasy_modifications, "max_specific_storage", atom_storage.max_specific_storage)
if(bonus >= 15)
atom_storage.max_specific_storage = max(WEIGHT_CLASS_HUGE, atom_storage.max_specific_storage)
else if(bonus >= 10)
atom_storage.max_specific_storage = max(WEIGHT_CLASS_BULKY, atom_storage.max_specific_storage)
else if(bonus <= -10)
atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL
else if(bonus <= -15)
atom_storage.max_specific_storage = WEIGHT_CLASS_TINY
/obj/item/storage/remove_fantasy_bonuses(bonus)
if(isnull(atom_storage)) // some abstract types of storage (yes i know) don't get a datum
return ..()
atom_storage.max_slots = reset_fantasy_variable("max_slots", atom_storage.max_slots)
atom_storage.max_total_storage = reset_fantasy_variable("max_total_storage", atom_storage.max_total_storage)
var/previous_max_storage = LAZYACCESS(fantasy_modifications, "max_specific_storage")
LAZYREMOVE(fantasy_modifications, "max_specific_storage")
if(previous_max_storage)
atom_storage.max_specific_storage = previous_max_storage
return ..()
/obj/item/storage/Initialize(mapload)
. = ..()
@@ -63,9 +33,9 @@
storage_type ||= src.storage_type
return ..()
/obj/item/storage/AllowDrop()
return FALSE
///Use this to populate the contents of the storage
/obj/item/storage/proc/PopulateContents()
PROTECTED_PROC(TRUE)
/obj/item/storage/contents_explosion(severity, target)
switch(severity)
@@ -77,30 +47,51 @@
SSexplosions.low_mov_atom += contents
/obj/item/storage/canStrip(mob/who)
. = ..()
if(!. && rummage_if_nodrop)
return TRUE
return TRUE
/obj/item/storage/doStrip(mob/who)
if(HAS_TRAIT(src, TRAIT_NODROP) && rummage_if_nodrop)
if(HAS_TRAIT(src, TRAIT_NODROP))
atom_storage.remove_all()
return TRUE
return ..()
/obj/item/storage/contents_explosion(severity, target)
//Cyberboss says: "USE THIS TO FILL IT, NOT INITIALIZE OR NEW"
/obj/item/storage/proc/PopulateContents()
/obj/item/storage/AllowDrop()
return FALSE
///Drops all contents of this storage on the turf of its parent
/obj/item/storage/proc/emptyStorage()
SHOULD_NOT_OVERRIDE(TRUE)
atom_storage.remove_all()
/obj/item/storage/Destroy()
for(var/obj/important_thing in contents)
if(!(important_thing.resistance_flags & INDESTRUCTIBLE))
continue
important_thing.forceMove(drop_location())
return ..()
/obj/item/storage/apply_fantasy_bonuses(bonus)
. = ..()
if(isnull(atom_storage)) // some abstract types of storage (yes i know) don't get a datum
return
atom_storage.max_slots = modify_fantasy_variable("max_slots", atom_storage.max_slots, round(bonus/2))
atom_storage.max_total_storage = modify_fantasy_variable("max_total_storage", atom_storage.max_total_storage, round(bonus/2))
LAZYSET(fantasy_modifications, "max_specific_storage", atom_storage.max_specific_storage)
if(bonus >= 15)
atom_storage.max_specific_storage = max(WEIGHT_CLASS_HUGE, atom_storage.max_specific_storage)
else if(bonus >= 10)
atom_storage.max_specific_storage = max(WEIGHT_CLASS_BULKY, atom_storage.max_specific_storage)
else if(bonus <= -10)
atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL
else if(bonus <= -15)
atom_storage.max_specific_storage = WEIGHT_CLASS_TINY
/obj/item/storage/remove_fantasy_bonuses(bonus)
. = ..()
if(isnull(atom_storage)) // some abstract types of storage (yes i know) don't get a datum
return
atom_storage.max_slots = reset_fantasy_variable("max_slots", atom_storage.max_slots)
atom_storage.max_total_storage = reset_fantasy_variable("max_total_storage", atom_storage.max_total_storage)
var/previous_max_storage = LAZYACCESS(fantasy_modifications, "max_specific_storage")
LAZYREMOVE(fantasy_modifications, "max_specific_storage")
if(previous_max_storage)
atom_storage.max_specific_storage = previous_max_storage
/// Returns a list of object types to be preloaded by our code
/// I'll say it again, be very careful with this. We only need it for a few things