001package com.fs.starfarer.api.util; 002 003import java.util.ArrayList; 004import java.util.HashSet; 005import java.util.List; 006import java.util.Set; 007 008public class TimeoutTracker<T> { 009 010 public static class ItemData<T> { 011 public T item; 012 public float remaining; 013 } 014 015 private List<ItemData<T>> items = new ArrayList<ItemData<T>>(); 016 transient private Set<T> set = new HashSet<T>(); 017 018 Object readResolve() { 019 set = new HashSet<T>(); 020 for (ItemData<T> item : items) { 021 set.add(item.item); 022 } 023 return this; 024 } 025 026 Object writeReplace() { 027 return this; 028 } 029 030 public void add(T item, float time) { 031 getData(item).remaining += time; 032 } 033 034 public void add(T item, float time, float limit) { 035 ItemData<T> d = getData(item); 036 if (time > 0 && d.remaining + time > limit) { 037 time = Math.max(0, limit - d.remaining); 038 } 039 d.remaining += time; 040 if (d.remaining < 0) { 041 d.remaining = 0; 042 } 043 } 044 045 public void set(T item, float time) { 046 getData(item).remaining = time; 047 } 048 049 public float getRemaining(T item) { 050 return getData(item).remaining; 051 } 052 053 public void remove(T item) { 054 for (ItemData<T> d : items) { 055 //if (d.item == item) { 056 if (d.item.equals(item)) { 057 items.remove(d); 058 set.remove(item); 059 return; 060 } 061 } 062 } 063 064 public List<T> getItems() { 065 List<T> list = new ArrayList<T>(); 066 for (ItemData<T> d : items) { 067 list.add(d.item); 068 } 069 return list; 070 } 071 072 public void clear() { 073 items.clear(); 074 set.clear(); 075 } 076 077 078 private ItemData<T> getData(T item) { 079 for (ItemData<T> d : items) { 080 //if (d.item == item) { 081 if (d.item.equals(item)) { 082 return d; 083 } 084 } 085 ItemData<T> d = new ItemData<T>(); 086 d.item = item; 087 d.remaining = 0; 088 items.add(d); 089 set.add(item); 090 return d; 091 } 092 093 public void advance(float amount) { 094 List<ItemData<T>> remove = new ArrayList<ItemData<T>>(); 095 for (ItemData<T> d : items) { 096// if (d.item instanceof CampaignEventListener) { 097// System.out.println("Remaining: " + d.remaining); 098// } 099 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