diff --git a/core/src/io/anuke/mindustry/ai/WaveSpawner.java b/core/src/io/anuke/mindustry/ai/WaveSpawner.java index fb8e8f3ff1..bba51232c8 100644 --- a/core/src/io/anuke/mindustry/ai/WaveSpawner.java +++ b/core/src/io/anuke/mindustry/ai/WaveSpawner.java @@ -4,7 +4,8 @@ import io.anuke.arc.Events; import io.anuke.arc.collection.Array; import io.anuke.arc.math.Angles; import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.*; +import io.anuke.arc.util.Time; +import io.anuke.arc.util.Tmp; import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.entities.Damage; @@ -13,12 +14,13 @@ import io.anuke.mindustry.entities.type.BaseUnit; import io.anuke.mindustry.game.EventType.WorldLoadEvent; import io.anuke.mindustry.game.SpawnGroup; import io.anuke.mindustry.net.Net; +import io.anuke.mindustry.world.Tile; import static io.anuke.mindustry.Vars.*; public class WaveSpawner{ private Array flySpawns = new Array<>(); - private Array groundSpawns = new Array<>(); + private Array groundSpawns = new Array<>(); private boolean spawning = false; public WaveSpawner(){ @@ -29,6 +31,10 @@ public class WaveSpawner{ return groundSpawns.size; } + public Array getGroundSpawns(){ + return groundSpawns; + } + /** @return true if the player is near a ground spawn point. */ public boolean playerNear(){ return groundSpawns.contains(g -> Mathf.dst(g.x * tilesize, g.y * tilesize, player.x, player.y) < state.rules.dropZoneRadius); @@ -58,9 +64,9 @@ public class WaveSpawner{ } } }else{ - for(GroundSpawn spawn : groundSpawns){ - spawnX = spawn.x * tilesize; - spawnY = spawn.y * tilesize; + for(Tile spawn : groundSpawns){ + spawnX = spawn.worldx(); + spawnY = spawn.worldy(); spread = tilesize * 2; for(int i = 0; i < spawned; i++){ @@ -101,10 +107,7 @@ public class WaveSpawner{ } private void addSpawns(int x, int y){ - GroundSpawn spawn = new GroundSpawn(); - spawn.x = x; - spawn.y = y; - groundSpawns.add(spawn); + groundSpawns.add(world.tile(x, y)); FlyerSpawn fspawn = new FlyerSpawn(); fspawn.angle = Angles.angle(world.width() / 2f, world.height() / 2f, x, y); diff --git a/core/src/io/anuke/mindustry/entities/type/Unit.java b/core/src/io/anuke/mindustry/entities/type/Unit.java index 6579af6c97..1eb1b48269 100644 --- a/core/src/io/anuke/mindustry/entities/type/Unit.java +++ b/core/src/io/anuke/mindustry/entities/type/Unit.java @@ -9,8 +9,7 @@ import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.math.Mathf; import io.anuke.arc.math.geom.Geometry; import io.anuke.arc.math.geom.Vector2; -import io.anuke.arc.util.Time; -import io.anuke.arc.util.Tmp; +import io.anuke.arc.util.*; import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.entities.*; @@ -256,6 +255,16 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ kill(); } + //apply knockback based on spawns + if(getTeam() != waveTeam){ + float relativeSize = state.rules.dropZoneRadius + getSize()/2f + 1f; + for(Tile spawn : world.spawner.getGroundSpawns()){ + if(withinDst(spawn.worldx(), spawn.worldy(), relativeSize)){ + velocity.add(Tmp.v1.set(this).sub(spawn.worldx(), spawn.worldy()).setLength(0.1f + 1f - dst(spawn) / relativeSize).scl(0.45f * Time.delta())); + } + } + } + if(isFlying()){ drownTime = 0f; move(velocity.x * Time.delta(), velocity.y * Time.delta());