forked from tgstation/tgstation
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Allow any datum to be pooled, including images
Tested on a non-ss13 project and works so it should work here. Renamed the file from atom_pool to pool I'll try to recap any other changes here: Changed pick_n_take to pop when grabbing stuff out of the pool. Contents is excluded from vars set to initial (would runtime with images), but it gets reset manually by atom/movable.
- Loading branch information
Showing
3 changed files
with
116 additions
and
112 deletions.
There are no files selected for viewing
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
|
||
/* | ||
/tg/station13 /datum Pool: | ||
--------------------------------- | ||
By RemieRichards | ||
Creation/Deletion is laggy, so let's reduce reuse and recycle! | ||
Usage: | ||
To get a object, just call | ||
- PoolOrNew(type, arg) if you only want to pass one argument to New(), usually loc | ||
- PoolOrNew(type, list) if you want to pass multiple arguments to New() | ||
To put a object back in the pool, call PlaceInPool(object) | ||
This will call destroy on the object, set its loc to null, | ||
and reset all of its vars to their default | ||
You can override your object's destroy to return QDEL_HINT_PLACEINPOOL | ||
to ensure its always placed in this pool (this will only be acted on if qdel calls destroy, and destroy will not get called twice) | ||
*/ | ||
|
||
var/global/list/GlobalPool = list() | ||
|
||
//You'll be using this proc 90% of the time. | ||
//It grabs a type from the pool if it can | ||
//And if it can't, it creates one | ||
//The pool is flexible and will expand to fit | ||
//The new created atom when it eventually | ||
//Goes into the pool | ||
|
||
//Second argument can be a single arg | ||
//Or a list of arguments | ||
//Either way it gets passed to new | ||
|
||
/proc/PoolOrNew(var/get_type,var/second_arg) | ||
if(!get_type) | ||
return | ||
|
||
. = GetFromPool(get_type,second_arg) | ||
|
||
if(!.) | ||
if(ispath(get_type)) | ||
if(islist(second_arg)) | ||
. = new get_type (arglist(second_arg)) | ||
else | ||
. = new get_type (second_arg) | ||
|
||
|
||
/proc/GetFromPool(var/get_type,var/second_arg) | ||
if(!get_type) | ||
return | ||
|
||
if(isnull(GlobalPool[get_type])) | ||
return | ||
|
||
if(length(GlobalPool[get_type]) == 0) | ||
return | ||
|
||
var/datum/pooled = pop(GlobalPool[get_type]) | ||
if(pooled) | ||
pooled.ResetVars() | ||
var/atom/movable/AM | ||
if(istype(pooled, /atom/movable)) | ||
AM = pooled | ||
|
||
if(islist(second_arg)) | ||
if(AM) | ||
AM.loc = second_arg[1] //we need to do loc setting explicetly before even calling New() to replicate new()'s behavior | ||
pooled.New(arglist(second_arg)) | ||
|
||
else | ||
if(AM) | ||
AM.loc = second_arg | ||
pooled.New(second_arg) | ||
|
||
return pooled | ||
|
||
|
||
/proc/PlaceInPool(var/datum/diver, destroy = 1) | ||
if(!istype(diver)) | ||
return | ||
|
||
if(diver in GlobalPool[diver.type]) | ||
return | ||
|
||
if(!GlobalPool[diver.type]) | ||
GlobalPool[diver.type] = list() | ||
|
||
GlobalPool[diver.type] |= diver | ||
|
||
if (destroy) | ||
diver.Destroy() | ||
|
||
diver.ResetVars() | ||
|
||
|
||
/datum/proc/ResetVars() | ||
var/list/excluded = list("animate_movement", "contents", "loc", "locs", "parent_type", "vars", "verbs", "type") | ||
|
||
for(var/V in vars) | ||
if(V in excluded) | ||
continue | ||
|
||
vars[V] = initial(vars[V]) | ||
|
||
/atom/movable/ResetVars() | ||
..() | ||
loc = null | ||
contents = initial(contents) //something is really wrong if this object still has stuff in it by this point | ||
|
||
/image/ResetVars() | ||
..() | ||
loc = null |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters