|
14 | 14 | var/mob/user |
15 | 15 | ///The client seeing the progress bar. |
16 | 16 | var/client/user_client |
| 17 | + ///Extra checks for whether to stop the progress. |
| 18 | + var/datum/callback/extra_checks |
17 | 19 | ///Effectively the number of steps the progress bar will need to do before reaching completion. |
18 | 20 | var/goal = 1 |
19 | 21 | ///Control check to see if the progress was interrupted before reaching its goal. |
20 | 22 | var/last_progress = 0 |
21 | 23 | ///Variable to ensure smooth visual stacking on multiple progress bars. |
22 | 24 | var/listindex = 0 |
| 25 | + ///Whether progress has already been ended. |
| 26 | + var/progress_ended = FALSE |
23 | 27 |
|
24 | 28 |
|
25 | | -/datum/progressbar/New(mob/User, goal_number, atom/target, skill_check) |
| 29 | +/datum/progressbar/New(mob/User, goal_number, atom/target, timed_action_flags = NONE, skill_check) |
26 | 30 | . = ..() |
27 | 31 | if (!istype(target)) |
28 | 32 | stack_trace("Invalid target [target] passed in") |
|
58 | 62 | RegisterSignal(user, COMSIG_QDELETING, PROC_REF(on_user_delete)) |
59 | 63 | RegisterSignal(user, COMSIG_MOB_LOGOUT, PROC_REF(clean_user_client)) |
60 | 64 | RegisterSignal(user, COMSIG_MOB_LOGIN, PROC_REF(on_user_login)) |
| 65 | + if(!(timed_action_flags & IGNORE_USER_LOC_CHANGE)) |
| 66 | + RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) |
| 67 | + var/obj/mecha/mech = user.loc |
| 68 | + if(ismecha(user.loc) && user == mech.occupant) |
| 69 | + RegisterSignal(mech, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) |
| 70 | + if(!(timed_action_flags & IGNORE_TARGET_LOC_CHANGE)) |
| 71 | + RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) |
| 72 | + if(!(timed_action_flags & IGNORE_HELD_ITEM)) |
| 73 | + var/obj/item/held = user.get_active_held_item() |
| 74 | + if(held) |
| 75 | + RegisterSignal(held, COMSIG_ITEM_EQUIPPED, PROC_REF(end_progress)) |
| 76 | + RegisterSignal(held, COMSIG_ITEM_DROPPED, PROC_REF(end_progress)) |
| 77 | + else |
| 78 | + RegisterSignal(user, COMSIG_MOB_PICKUP_ITEM, PROC_REF(end_progress)) |
| 79 | + RegisterSignal(user, COMSIG_MOB_SWAPPING_HANDS, PROC_REF(end_progress)) |
| 80 | + if(!(timed_action_flags & IGNORE_INCAPACITATED)) |
| 81 | + RegisterSignal(user, SIGNAL_ADDTRAIT(TRAIT_INCAPACITATED), PROC_REF(end_progress)) |
61 | 82 |
|
62 | 83 |
|
63 | 84 | /datum/progressbar/Destroy() |
|
139 | 160 |
|
140 | 161 | ///Updates the progress bar image visually. |
141 | 162 | /datum/progressbar/proc/update(progress) |
| 163 | + if(progress_ended) |
| 164 | + return FALSE |
142 | 165 | progress = clamp(progress, 0, goal) |
143 | 166 | if(progress == last_progress) |
144 | | - return |
| 167 | + return FALSE |
145 | 168 | last_progress = progress |
| 169 | + if(extra_checks && !extra_checks.Invoke()) |
| 170 | + return FALSE |
146 | 171 | bar.icon_state = "prog_bar_[round(((progress / goal) * 100), 5)]" |
| 172 | + return TRUE |
147 | 173 |
|
148 | 174 |
|
149 | 175 | ///Called on progress end, be it successful or a failure. Wraps up things to delete the datum and bar. |
150 | 176 | /datum/progressbar/proc/end_progress() |
| 177 | + if(progress_ended) |
| 178 | + return |
| 179 | + progress_ended = TRUE |
| 180 | + |
151 | 181 | if(last_progress != goal) |
152 | 182 | bar.icon_state = "[bar.icon_state]_fail" |
153 | 183 |
|
|
157 | 187 |
|
158 | 188 | QDEL_IN(src, PROGRESSBAR_ANIMATION_TIME) |
159 | 189 |
|
| 190 | +/datum/progressbar/proc/on_moved(atom/movable/mover, atom/old_loc, movement_dir, forced, list/old_locs, momentum_change, interrupting) |
| 191 | + SIGNAL_HANDLER |
| 192 | + if(!interrupting) |
| 193 | + return |
| 194 | + if(!mover.Process_Spacemove() && mover.inertia_dir) |
| 195 | + return |
| 196 | + INVOKE_ASYNC(src, PROC_REF(end_progress)) |
160 | 197 |
|
161 | 198 | #undef SKILL_ICON_OFFSET_Y |
162 | 199 | #undef SKILL_ICON_OFFSET_X |
|
0 commit comments