67 lines
1.8 KiB
Java
67 lines
1.8 KiB
Java
package mindustry.game;
|
|
|
|
import arc.math.geom.*;
|
|
import arc.struct.*;
|
|
import arc.util.*;
|
|
import mindustry.annotations.Annotations.*;
|
|
import mindustry.gen.*;
|
|
|
|
/** Updates and stores attack indicators for the minimap. */
|
|
public class AttackIndicators{
|
|
private static final float duration = 15f * 60f;
|
|
|
|
private LongSeq indicators = new LongSeq(false, 16);
|
|
private IntIntMap posToIndex = new IntIntMap();
|
|
|
|
public LongSeq list(){
|
|
return indicators;
|
|
}
|
|
|
|
public void clear(){
|
|
indicators.clear();
|
|
posToIndex.clear();
|
|
}
|
|
|
|
public void add(int x, int y){
|
|
int pos = Point2.pack(x, y);
|
|
int index = posToIndex.get(pos, -1);
|
|
|
|
//there is an existing indicator...
|
|
if(index != -1){
|
|
//reset its time (new attack)
|
|
indicators.items[index] = Indicator.time(indicators.items[index], 0f);
|
|
}else{
|
|
//new indicator created
|
|
indicators.add(Indicator.get(pos, 0f));
|
|
posToIndex.put(pos, indicators.size - 1);
|
|
}
|
|
}
|
|
|
|
public void update(){
|
|
long[] items = indicators.items;
|
|
for(int i = 0; i < indicators.size; i ++){
|
|
long l = items[i];
|
|
items[i] = l = Indicator.time(l, Indicator.time(l) + Time.delta);
|
|
|
|
if(Indicator.time(l) >= duration){
|
|
//remove the indicator as it has timed out, make sure to not skip the next one
|
|
indicators.removeIndex(i);
|
|
posToIndex.remove(Indicator.pos(l));
|
|
|
|
if(indicators.size > 0){
|
|
//relocation of head to this new index
|
|
posToIndex.put(Indicator.pos(items[i]), i);
|
|
}
|
|
|
|
i --;
|
|
}
|
|
}
|
|
}
|
|
|
|
@Struct
|
|
class IndicatorStruct{
|
|
int pos;
|
|
float time;
|
|
}
|
|
}
|