This commit is contained in:
Anuken 2020-10-13 15:56:00 -04:00
parent ca875876cd
commit 5d76dd0e2f
7 changed files with 58 additions and 41 deletions

View File

@ -10,6 +10,7 @@ import arc.util.*;
import mindustry.content.*;
import mindustry.game.EventType.*;
import mindustry.game.*;
import mindustry.game.Teams.*;
import mindustry.gen.*;
import mindustry.type.*;
import mindustry.world.*;
@ -205,13 +206,14 @@ public class BlockIndexer{
/** Get all enemy blocks with a flag. */
public Seq<Tile> getEnemy(Team team, BlockFlag type){
returnArray.clear();
for(Team enemy : team.enemies()){
if(state.teams.isActive(enemy)){
TileArray set = getFlagged(enemy)[type.ordinal()];
if(set != null){
for(Tile tile : set){
returnArray.add(tile);
}
Seq<TeamData> data = state.teams.present;
for(int i = 0; i < data.size; i++){
Team enemy = data.items[i].team;
if(enemy == team) continue;
TileArray set = getFlagged(enemy)[type.ordinal()];
if(set != null){
for(Tile tile : set){
returnArray.add(tile);
}
}
}

View File

@ -14,7 +14,7 @@ import static mindustry.Vars.*;
public class LogicAI extends AIController{
/** Minimum delay between item transfers. */
public static final float transferDelay = 60f * 2f;
public static final float transferDelay = 60f * 3f;
/** Time after which the unit resets its controlled and reverts to a normal unit. */
public static final float logicControlTimeout = 10f * 60f;

View File

@ -3,9 +3,11 @@ package mindustry.entities;
import arc.*;
import arc.func.*;
import arc.math.geom.*;
import arc.struct.*;
import mindustry.annotations.Annotations.*;
import mindustry.content.*;
import mindustry.game.*;
import mindustry.game.Teams.*;
import mindustry.gen.*;
import mindustry.type.*;
import mindustry.world.*;
@ -308,20 +310,12 @@ public class Units{
/** Iterates over all units that are enemies of this team. */
public static void nearbyEnemies(Team team, float x, float y, float width, float height, Cons<Unit> cons){
if(team.active()){
for(Team enemy : state.teams.enemiesOf(team)){
nearby(enemy, x, y, width, height, cons);
}
}else{
//inactive teams have no cache, check everything
//TODO cache all teams with units OR blocks
for(Team other : Team.all){
if(other != team && other.data().unitCount > 0){
nearby(other, x, y, width, height, cons);
}
Seq<TeamData> data = state.teams.present;
for(int i = 0; i < data.size; i++){
if(data.items[i].team != team){
nearby(data.items[i].team, x, y, width, height, cons);
}
}
}
/** Iterates over all units that are enemies of this team. */

View File

@ -9,6 +9,7 @@ import arc.util.*;
import mindustry.annotations.Annotations.*;
import mindustry.entities.bullet.*;
import mindustry.game.*;
import mindustry.game.Teams.*;
import mindustry.gen.*;
import mindustry.graphics.*;
@ -28,15 +29,10 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw
@Override
public void getCollisions(Cons<QuadTree> consumer){
if(team.active()){
for(Team team : team.enemies()){
consumer.get(team.data().tree());
}
}else{
for(Team other : Team.all){
if(other != team && team.data().unitCount > 0){
consumer.get(team.data().tree());
}
Seq<TeamData> data = state.teams.present;
for(int i = 0; i < data.size; i++){
if(data.items[i].team != team){
consumer.get(data.items[i].tree);
}
}
}

View File

@ -83,9 +83,9 @@ public class Team implements Comparable<Team>{
return state.rules.teams.get(this);
}
public Team[] enemies(){
return state.teams.enemiesOf(this);
}
//public Team[] enemies(){
// return state.teams.enemiesOf(this);
//}
public TeamData data(){
return state.teams.get(this);

View File

@ -23,7 +23,9 @@ public class Teams{
/** Maps team IDs to team data. */
private TeamData[] map = new TeamData[256];
/** Active teams. */
private Seq<TeamData> active = new Seq<>();
public Seq<TeamData> active = new Seq<>();
/** Teams with block or unit presence. */
public Seq<TeamData> present = new Seq<>(TeamData.class);
public Teams(){
active.add(get(Team.crux));
@ -31,7 +33,7 @@ public class Teams{
@Nullable
public CoreBuild closestEnemyCore(float x, float y, Team team){
for(Team enemy : team.enemies()){
for(Team enemy : team.data().coreEnemies){
CoreBuild tile = Geometry.findClosest(x, y, enemy.cores());
if(tile != null) return tile;
}
@ -43,9 +45,9 @@ public class Teams{
return Geometry.findClosest(x, y, get(team).cores);
}
public Team[] enemiesOf(Team team){
return get(team).enemies;
}
//public Team[] enemiesOf(Team team){
// return get(team).enemies;
//}
public boolean eachEnemyCore(Team team, Boolf<CoreBuild> ret){
for(TeamData data : active){
@ -145,9 +147,12 @@ public class Teams{
}
public void updateTeamStats(){
present.clear();
for(Team team : Team.all){
TeamData data = team.data();
data.presentFlag = false;
data.unitCount = 0;
data.units.clear();
if(data.tree != null){
@ -168,10 +173,14 @@ public class Teams{
}
}
//update presence flag.
Groups.build.each( b -> b.team.data().presentFlag = true);
for(Unit unit : Groups.unit){
TeamData data = unit.team.data();
data.tree().insert(unit);
data.units.add(unit);
data.presentFlag = true;
if(data.unitsByType == null || data.unitsByType.length <= unit.type().id){
data.unitsByType = new Seq[content.units().size];
@ -185,6 +194,15 @@ public class Teams{
count(unit);
}
//update presence of each team.
for(Team team : Team.all){
TeamData data = team.data();
if(data.presentFlag || data.active()){
present.add(data);
}
}
}
private void updateEnemies(){
@ -201,7 +219,7 @@ public class Teams{
}
}
data.enemies = enemies.toArray(Team.class);
data.coreEnemies = enemies.toArray(Team.class);
}
}
@ -210,7 +228,10 @@ public class Teams{
public final Team team;
public final BaseAI ai;
public Team[] enemies = {};
private boolean presentFlag;
/** Enemies with cores or spawn points. */
public Team[] coreEnemies = {};
/** Planned blocks for drones. This is usually only blocks that have been broken. */
public Queue<BlockPlan> blocks = new Queue<>();
/** The current command for units to follow. */

View File

@ -10,6 +10,7 @@ import mindustry.content.*;
import mindustry.ctype.*;
import mindustry.entities.*;
import mindustry.game.*;
import mindustry.game.Teams.*;
import mindustry.gen.*;
import mindustry.type.*;
import mindustry.world.*;
@ -674,8 +675,11 @@ public class LExecutor{
bestValue = 0;
if(enemies){
for(Team enemy : state.teams.enemiesOf(r.team())){
find(r, range, sortDir, enemy);
Seq<TeamData> data = state.teams.present;
for(int i = 0; i < data.size; i++){
if(data.items[i].team != r.team()){
find(r, range, sortDir, data.items[i].team);
}
}
}else{
find(r, range, sortDir, r.team());