Starsector API
Loading...
Searching...
No Matches
TimeoutTracker.java
Go to the documentation of this file.
1package com.fs.starfarer.api.util;
2
3import java.util.ArrayList;
4import java.util.HashSet;
5import java.util.List;
6import java.util.Set;
7
8public class TimeoutTracker<T> {
9
10 public static class ItemData<T> {
11 public T item;
12 public float remaining;
13 }
14
15 private List<ItemData<T>> items = new ArrayList<ItemData<T>>();
16 transient private Set<T> set = new HashSet<T>();
17
18 Object readResolve() {
19 set = new HashSet<T>();
20 for (ItemData<T> item : items) {
21 set.add(item.item);
22 }
23 return this;
24 }
25
26 Object writeReplace() {
27 return this;
28 }
29
30 public void add(T item, float time) {
31 getData(item).remaining += time;
32 }
33
34 public void add(T item, float time, float limit) {
35 ItemData<T> d = getData(item);
36 if (time > 0 && d.remaining + time > limit) {
37 time = Math.max(0, limit - d.remaining);
38 }
39 d.remaining += time;
40 if (d.remaining < 0) {
41 d.remaining = 0;
42 }
43 }
44
45 public void set(T item, float time) {
46 getData(item).remaining = time;
47 }
48
49 public float getRemaining(T item) {
50 return getData(item).remaining;
51 }
52
53 public void remove(T item) {
54 for (ItemData<T> d : items) {
55 //if (d.item == item) {
56 if (d.item.equals(item)) {
57 items.remove(d);
58 set.remove(item);
59 return;
60 }
61 }
62 }
63
64 public List<T> getItems() {
65 List<T> list = new ArrayList<T>();
66 for (ItemData<T> d : items) {
67 list.add(d.item);
68 }
69 return list;
70 }
71
72 public void clear() {
73 items.clear();
74 set.clear();
75 }
76
77
78 private ItemData<T> getData(T item) {
79 for (ItemData<T> d : items) {
80 //if (d.item == item) {
81 if (d.item.equals(item)) {
82 return d;
83 }
84 }
85 ItemData<T> d = new ItemData<T>();
86 d.item = item;
87 d.remaining = 0;
88 items.add(d);
89 set.add(item);
90 return d;
91 }
92
93 public void advance(float amount) {
95 for (ItemData<T> d : items) {
96// if (d.item instanceof CampaignEventListener) {
97// System.out.println("Remaining: " + d.remaining);
98// }
99 d.remaining -= amount;
100 if (d.remaining <= 0) {
101 remove.add(d);
102 set.remove(d.item);
103 }
104 }
105 items.removeAll(remove);
106 }
107
108 public boolean contains(T item) {
109 return set.contains(item);
110// for (ItemData d : items) {
111// if (d.item == item) {
112// return true;
113// }
114// }
115// return false;
116 }
117}
118
119
120
121
122
123
124
void add(T item, float time, float limit)