#define PROGRESSBAR_HEIGHT 6 #define PROGRESSBAR_ANIMATION_TIME 5 /datum/progressbar var/goal = 1 var/destroy_on_full = FALSE var/last_progress = 0 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/progressbar.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 = 0 if(istype(target, /atom/movable)) var/atom/movable/AM = target bar.pixel_x = AM.get_floating_chat_x_offset() bar.alpha = 0 animate(bar, pixel_y = 32 + (PROGRESSBAR_HEIGHT * (listindex - 1)), alpha = 255, time = PROGRESSBAR_ANIMATION_TIME, easing = SINE_EASING) /datum/progressbar/proc/update(progress) if (!user || !user.client) shown = FALSE 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 = TRUE if(destroy_on_full && progress == goal) QDEL_IN(src, 5) /datum/progressbar/proc/shiftDown() --listindex bar.pixel_y = 32 + (PROGRESSBAR_HEIGHT * (listindex - 1)) var/dist_to_travel = 32 + (PROGRESSBAR_HEIGHT * (listindex - 1)) - PROGRESSBAR_HEIGHT animate(bar, pixel_y = dist_to_travel, time = PROGRESSBAR_ANIMATION_TIME, easing = SINE_EASING) /datum/progressbar/Destroy() if(last_progress != goal) bar.icon_state = "[bar.icon_state]_fail" 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) animate(bar, alpha = 0, time = PROGRESSBAR_ANIMATION_TIME) addtimer(CALLBACK(src, .proc/remove_from_client), PROGRESSBAR_ANIMATION_TIME, TIMER_CLIENT_TIME) QDEL_IN(bar, PROGRESSBAR_ANIMATION_TIME * 2) //for garbage collection safety . = ..() /datum/progressbar/proc/remove_from_client() if(client) client.images -= bar client = null /datum/progressbar/autocomplete destroy_on_full = TRUE #undef PROGRESSBAR_ANIMATION_TIME #undef PROGRESSBAR_HEIGHT