Massively improved thread safety

This commit is contained in:
Anuken
2018-10-20 11:25:58 -04:00
parent 22328772ca
commit b1cda57174
8 changed files with 69 additions and 31 deletions

View File

@@ -11,6 +11,7 @@ import io.anuke.ucore.entities.EntityGroup;
import io.anuke.ucore.entities.EntityQuery;
import io.anuke.ucore.function.Consumer;
import io.anuke.ucore.function.Predicate;
import io.anuke.ucore.util.Threads;
import io.anuke.ucore.util.EnumSet;
import static io.anuke.mindustry.Vars.*;
@@ -20,10 +21,11 @@ import static io.anuke.mindustry.Vars.*;
*/
public class Units{
private static Rectangle rect = new Rectangle();
private static Rectangle rectGraphics = new Rectangle();
private static Rectangle hitrect = new Rectangle();
private static Unit result;
private static float cdist;
private static boolean boolResult;
private static boolean boolResult, boolResultGraphics;
/**
* Validates a target.
@@ -63,22 +65,43 @@ public class Units{
return anyEntities(rect);
}
/**Can be called from any thread.*/
public static boolean anyEntities(Rectangle rect){
if(Threads.isLogic()){
boolResult = false;
boolResult = false;
Units.getNearby(rect, unit -> {
if(boolResult) return;
if(!unit.isFlying()){
unit.getHitbox(hitrect);
Units.getNearby(rect, unit -> {
if(boolResult) return;
if(!unit.isFlying()){
unit.getHitbox(hitrect);
if(hitrect.overlaps(rect)){
boolResult = true;
if(hitrect.overlaps(rect)){
boolResult = true;
}
}
}
});
});
return boolResult;
return boolResult;
}else{
for(EntityGroup<? extends BaseUnit> g : unitGroups){
g.forEach(u -> {
u.getHitbox(rectGraphics);
if(rectGraphics.overlaps(rect)){
boolResultGraphics = true;
}
});
if(boolResultGraphics) return true;
}
playerGroup.forEach(u -> {
u.getHitbox(rectGraphics);
if(rectGraphics.overlaps(rect)){
boolResultGraphics = true;
}
});
return boolResultGraphics;
}
}
/**Returns whether there are any entities on this tile, with the hitbox expanded.*/