Files
Aurora.3/code/datums/progressbar.dm
Lohikar 36164a15d4 Better action progress bars (#3175)
changes:

Progress bars will now stack if there is multiple ones on a single turf.
Progress bars' update speed is now mediated by stoplag() instead of arbitrary numticks numbers.
A callback can now be passed to do_after or do_mob which will be called every check - if the callback returns FALSE, the action is cancelled.
Progress bars no longer show an X briefly when their associated action is cancelled.
Progress bar itself is from /tg/, do_after changes are not.
2017-07-31 20:23:47 +03:00

67 lines
1.6 KiB
Plaintext

#define PROGRESSBAR_HEIGHT 6
/datum/progressbar
var/goal = 1
var/image/bar
var/shown = 0
var/mob/user
var/client/client
var/listindex
/datum/progressbar/New(mob/User, goal_number, atom/target)
. = ..()
if (!istype(target))
EXCEPTION("Invalid target given")
if (goal_number)
goal = goal_number
bar = image('icons/effects/progessbar.dmi', target, "prog_bar_0", 21)
bar.appearance_flags = RESET_COLOR|RESET_TRANSFORM|NO_CLIENT_COLOR|RESET_ALPHA
user = User
if(user)
client = user.client
LAZYINITLIST(user.progressbars)
LAZYINITLIST(user.progressbars[bar.loc])
var/list/bars = user.progressbars[bar.loc]
bars += src
listindex = bars.len
bar.pixel_y = 32 + (PROGRESSBAR_HEIGHT * (listindex - 1))
/datum/progressbar/proc/update(progress)
if (!user || !user.client)
shown = 0
return
if (user.client != client)
if (client)
client.images -= bar
if (user.client)
user.client.images += bar
progress = Clamp(progress, 0, goal)
bar.icon_state = "prog_bar_[round(((progress / goal) * 100), 5)]"
if (!shown)
user.client.images += bar
shown = 1
/datum/progressbar/proc/shiftDown()
--listindex
bar.pixel_y -= PROGRESSBAR_HEIGHT
/datum/progressbar/Destroy()
for(var/I in user.progressbars[bar.loc])
var/datum/progressbar/P = I
if(P != src && P.listindex > listindex)
P.shiftDown()
var/list/bars = user.progressbars[bar.loc]
bars -= src
if(!bars.len)
LAZYREMOVE(user.progressbars, bar.loc)
if (client)
client.images -= bar
qdel(bar)
. = ..()
#undef PROGRESSBAR_HEIGHT