Pad respawning

This commit is contained in:
Anuken
2019-02-02 16:10:29 -05:00
parent 67940476af
commit 696e6cb84b
6 changed files with 9 additions and 57 deletions

View File

@@ -3,7 +3,6 @@ package io.anuke.mindustry.ai;
import io.anuke.arc.Events; import io.anuke.arc.Events;
import io.anuke.arc.collection.Array; import io.anuke.arc.collection.Array;
import io.anuke.arc.collection.IntArray; import io.anuke.arc.collection.IntArray;
import io.anuke.mindustry.entities.Effects;
import io.anuke.arc.math.Angles; import io.anuke.arc.math.Angles;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.util.Time; import io.anuke.arc.util.Time;
@@ -11,8 +10,8 @@ import io.anuke.arc.util.Tmp;
import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.content.Blocks;
import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.content.Fx;
import io.anuke.mindustry.entities.Damage; import io.anuke.mindustry.entities.Damage;
import io.anuke.mindustry.entities.Effects;
import io.anuke.mindustry.entities.type.BaseUnit; import io.anuke.mindustry.entities.type.BaseUnit;
import io.anuke.mindustry.entities.units.Squad;
import io.anuke.mindustry.game.EventType.WorldLoadEvent; import io.anuke.mindustry.game.EventType.WorldLoadEvent;
import io.anuke.mindustry.game.SpawnGroup; import io.anuke.mindustry.game.SpawnGroup;
import io.anuke.mindustry.world.Pos; import io.anuke.mindustry.world.Pos;
@@ -68,7 +67,6 @@ public class WaveSpawner{
if(group.type.isFlying){ if(group.type.isFlying){
for(FlyerSpawn spawn : flySpawns){ for(FlyerSpawn spawn : flySpawns){
Squad squad = new Squad();
float margin = 40f; //how far away from the edge flying units spawn float margin = 40f; //how far away from the edge flying units spawn
float trns = (world.width() + world.height()) * tilesize; float trns = (world.width() + world.height()) * tilesize;
spawnX = Mathf.clamp(world.width() * tilesize / 2f + Angles.trnsx(spawn.angle, trns), -margin, world.width() * tilesize + margin); spawnX = Mathf.clamp(world.width() * tilesize / 2f + Angles.trnsx(spawn.angle, trns), -margin, world.width() * tilesize + margin);
@@ -77,15 +75,12 @@ public class WaveSpawner{
for(int i = 0; i < spawned; i++){ for(int i = 0; i < spawned; i++){
BaseUnit unit = group.createUnit(waveTeam); BaseUnit unit = group.createUnit(waveTeam);
unit.setWave();
unit.setSquad(squad);
unit.set(spawnX + Mathf.range(spread), spawnY + Mathf.range(spread)); unit.set(spawnX + Mathf.range(spread), spawnY + Mathf.range(spread));
unit.add(); unit.add();
} }
} }
}else{ }else{
for(GroundSpawn spawn : groundSpawns){ for(GroundSpawn spawn : groundSpawns){
Squad squad = new Squad();
spawnX = spawn.x * tilesize; spawnX = spawn.x * tilesize;
spawnY = spawn.y * tilesize; spawnY = spawn.y * tilesize;
spread = tilesize*3; spread = tilesize*3;
@@ -94,8 +89,6 @@ public class WaveSpawner{
Tmp.v1.rnd(spread); Tmp.v1.rnd(spread);
BaseUnit unit = group.createUnit(waveTeam); BaseUnit unit = group.createUnit(waveTeam);
unit.setWave();
unit.setSquad(squad);
unit.set(spawnX + Tmp.v1.x, spawnY + Tmp.v1.y); unit.set(spawnX + Tmp.v1.x, spawnY + Tmp.v1.y);
Time.run(i*5, () -> { Time.run(i*5, () -> {

View File

@@ -16,7 +16,6 @@ import io.anuke.mindustry.entities.EntityGroup;
import io.anuke.mindustry.entities.Units; import io.anuke.mindustry.entities.Units;
import io.anuke.mindustry.entities.traits.ShooterTrait; import io.anuke.mindustry.entities.traits.ShooterTrait;
import io.anuke.mindustry.entities.traits.TargetTrait; import io.anuke.mindustry.entities.traits.TargetTrait;
import io.anuke.mindustry.entities.units.Squad;
import io.anuke.mindustry.entities.units.StateMachine; import io.anuke.mindustry.entities.units.StateMachine;
import io.anuke.mindustry.entities.units.UnitDrops; import io.anuke.mindustry.entities.units.UnitDrops;
import io.anuke.mindustry.entities.units.UnitState; import io.anuke.mindustry.entities.units.UnitState;
@@ -50,8 +49,6 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
protected StateMachine state = new StateMachine(); protected StateMachine state = new StateMachine();
protected TargetTrait target; protected TargetTrait target;
protected boolean isWave;
protected Squad squad;
protected int spawner = noSpawner; protected int spawner = noSpawner;
/**internal constructor used for deserialization, DO NOT USE*/ /**internal constructor used for deserialization, DO NOT USE*/
@@ -93,16 +90,6 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
this.spawner = tile.pos(); this.spawner = tile.pos();
} }
/**Sets this to a 'wave' unit, which means it has slightly different AI and will not run out of ammo.*/
public void setWave(){
isWave = true;
}
public void setSquad(Squad squad){
this.squad = squad;
squad.units++;
}
public void rotate(float angle){ public void rotate(float angle){
rotation = Mathf.slerpDelta(rotation, angle, type.rotatespeed); rotation = Mathf.slerpDelta(rotation, angle, type.rotatespeed);
} }
@@ -331,7 +318,6 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
public void writeSave(DataOutput stream) throws IOException{ public void writeSave(DataOutput stream) throws IOException{
super.writeSave(stream); super.writeSave(stream);
stream.writeByte(type.id); stream.writeByte(type.id);
stream.writeBoolean(isWave);
stream.writeInt(spawner); stream.writeInt(spawner);
} }
@@ -339,7 +325,6 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
public void readSave(DataInput stream) throws IOException{ public void readSave(DataInput stream) throws IOException{
super.readSave(stream); super.readSave(stream);
byte type = stream.readByte(); byte type = stream.readByte();
this.isWave = stream.readBoolean();
this.spawner = stream.readInt(); this.spawner = stream.readInt();
this.type = content.getByID(ContentType.unit, type); this.type = content.getByID(ContentType.unit, type);

View File

@@ -150,11 +150,6 @@ public abstract class FlyingUnit extends BaseUnit{
Geometry.findClosest(x, y, world.indexer.getAllied(team, BlockFlag.repair)) != null){ Geometry.findClosest(x, y, world.indexer.getAllied(team, BlockFlag.repair)) != null){
setState(retreat); setState(retreat);
} }
if(squad != null){
squad.direction.add(velocity.x / squad.units, velocity.y / squad.units);
velocity.setAngle(Mathf.slerpDelta(velocity.angle(), squad.direction.angle(), 0.3f));
}
} }
@Override @Override

View File

@@ -64,7 +64,7 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{
public boolean achievedFlight; public boolean achievedFlight;
public Color color = new Color(); public Color color = new Color();
public Mech mech; public Mech mech;
public SpawnerTrait spawner; public SpawnerTrait spawner, lastSpawner;
public NetConnection con; public NetConnection con;
public int playerIndex = 0; public int playerIndex = 0;
@@ -90,6 +90,7 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{
player.dead = true; player.dead = true;
player.placeQueue.clear(); player.placeQueue.clear();
player.onDeath(); player.onDeath();
player.mech = (player.isMobile ? Mechs.starterMobile : Mechs.starterDesktop);
} }
@Override @Override
@@ -760,16 +761,18 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{
if(spawner != null && spawner.isValid()){ if(spawner != null && spawner.isValid()){
spawner.updateSpawning(this); spawner.updateSpawning(this);
}else{ }else if(!netServer.isWaitingForPlayers()){
CoreEntity entity = (CoreEntity) getClosestCore(); if(lastSpawner != null && lastSpawner.isValid()){
if(entity != null && !netServer.isWaitingForPlayers()){ this.spawner = lastSpawner;
this.spawner = (SpawnerTrait)entity.tile.entity; }else if(getClosestCore() != null){
this.spawner = (SpawnerTrait)getClosestCore();
} }
} }
} }
public void beginRespawning(SpawnerTrait spawner){ public void beginRespawning(SpawnerTrait spawner){
this.spawner = spawner; this.spawner = spawner;
this.lastSpawner = spawner;
this.dead = true; this.dead = true;
} }

View File

@@ -1,23 +0,0 @@
package io.anuke.mindustry.entities.units;
import io.anuke.arc.Core;
import io.anuke.arc.math.geom.Vector2;
/**
* Used to group entities together, for formations and such.
* Usually, squads are used by units spawned in the same wave.
*/
//TODO remove? is this necessary?
public class Squad{
public Vector2 direction = new Vector2();
public int units;
private long lastUpdated;
protected void update(){
if(Core.graphics.getFrameId() != lastUpdated){
direction.setZero();
lastUpdated = Core.graphics.getFrameId();
}
}
}

View File

@@ -212,7 +212,6 @@ public class MechPad extends Block{
@Override @Override
public void updateSpawning(Player unit){ public void updateSpawning(Player unit){
if(player == null){ if(player == null){
progress = 0f; progress = 0f;
player = unit; player = unit;