diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index 0afd019eae..7f46d4d7d9 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -11,11 +11,11 @@ import io.anuke.arc.util.*; import io.anuke.mindustry.ai.*; import io.anuke.mindustry.core.*; import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.entities.effect.*; -import io.anuke.mindustry.entities.impl.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.entities.type.Bullet; +import io.anuke.mindustry.entities.type.EffectEntity; import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.input.*; diff --git a/core/src/io/anuke/mindustry/ai/WaveSpawner.java b/core/src/io/anuke/mindustry/ai/WaveSpawner.java index a4d815dc95..daf4e7b00a 100644 --- a/core/src/io/anuke/mindustry/ai/WaveSpawner.java +++ b/core/src/io/anuke/mindustry/ai/WaveSpawner.java @@ -14,7 +14,6 @@ import io.anuke.mindustry.entities.Effects; 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.*; diff --git a/core/src/io/anuke/mindustry/content/Blocks.java b/core/src/io/anuke/mindustry/content/Blocks.java index dd16e72a88..93637d966d 100644 --- a/core/src/io/anuke/mindustry/content/Blocks.java +++ b/core/src/io/anuke/mindustry/content/Blocks.java @@ -8,6 +8,7 @@ import io.anuke.arc.util.*; import io.anuke.mindustry.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.bullet.*; +import io.anuke.mindustry.entities.type.Bullet; import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; @@ -1493,7 +1494,7 @@ public class Blocks implements ContentList{ } @Override - public void init(Bullet b){ + public void init(io.anuke.mindustry.entities.type.Bullet b){ for(int i = 0; i < rays; i++){ Damage.collideLine(b, b.getTeam(), hitEffect, b.x, b.y, b.rot(), rayLength - Math.abs(i - (rays / 2)) * 20f); } diff --git a/core/src/io/anuke/mindustry/content/Bullets.java b/core/src/io/anuke/mindustry/content/Bullets.java index 66ca2f4f3e..dad4758000 100644 --- a/core/src/io/anuke/mindustry/content/Bullets.java +++ b/core/src/io/anuke/mindustry/content/Bullets.java @@ -8,6 +8,7 @@ import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.entities.effect.*; import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.entities.type.Bullet; import io.anuke.mindustry.game.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.world.*; diff --git a/core/src/io/anuke/mindustry/content/TechTree.java b/core/src/io/anuke/mindustry/content/TechTree.java index 721408bf56..0c325b47a1 100644 --- a/core/src/io/anuke/mindustry/content/TechTree.java +++ b/core/src/io/anuke/mindustry/content/TechTree.java @@ -8,10 +8,13 @@ import io.anuke.mindustry.world.Block; import static io.anuke.mindustry.content.Blocks.*; public class TechTree implements ContentList{ + public static Array all; public static TechNode root; @Override public void load(){ + all = new Array<>(); + root = node(coreShard, () -> { node(conveyor, () -> { @@ -326,6 +329,7 @@ public class TechTree implements ContentList{ context = this; children.run(); context = last; + all.add(this); } } } diff --git a/core/src/io/anuke/mindustry/content/UnitTypes.java b/core/src/io/anuke/mindustry/content/UnitTypes.java index db601d03af..06ad0a9e17 100644 --- a/core/src/io/anuke/mindustry/content/UnitTypes.java +++ b/core/src/io/anuke/mindustry/content/UnitTypes.java @@ -3,6 +3,7 @@ package io.anuke.mindustry.content; import io.anuke.arc.collection.*; import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.entities.type.Bullet; import io.anuke.mindustry.entities.type.base.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index fea0c88db5..74caa7e884 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -184,7 +184,7 @@ public class NetServer implements ApplicationListener{ platform.updateRPC(); - Events.fire(new PlayerJoin(player)); + Events.fire(new PlayerConnect(player)); }); net.handleServer(InvokePacket.class, (con, packet) -> { @@ -546,6 +546,8 @@ public class NetServer implements ApplicationListener{ player.con.hasConnected = true; Call.sendMessage("[accent]" + player.name + "[accent] has connected."); Log.info("&lm[{1}] &y{0} has connected. ", player.name, player.uuid); + + Events.fire(new PlayerJoin(player)); } public boolean isWaitingForPlayers(){ diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java index 88ce601fb8..e5245d5e78 100644 --- a/core/src/io/anuke/mindustry/core/Renderer.java +++ b/core/src/io/anuke/mindustry/core/Renderer.java @@ -16,9 +16,9 @@ import io.anuke.mindustry.core.GameState.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.effect.*; import io.anuke.mindustry.entities.effect.GroundEffectEntity.*; -import io.anuke.mindustry.entities.impl.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.entities.type.EffectEntity; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.graphics.*; diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index 13b2eaa25e..e649b974e2 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -14,6 +14,7 @@ import io.anuke.arc.freetype.FreeTypeFontGenerator.*; import io.anuke.arc.freetype.FreetypeFontLoader.*; import io.anuke.arc.function.*; import io.anuke.arc.graphics.*; +import io.anuke.arc.graphics.Texture.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.input.*; import io.anuke.arc.math.*; @@ -137,6 +138,8 @@ public class UI implements ApplicationListener, Loadable{ parameter.fontParameters.borderWidth = Scl.scl(2f); parameter.fontParameters.spaceX -= parameter.fontParameters.borderWidth; } + parameter.fontParameters.magFilter = TextureFilter.Linear; + parameter.fontParameters.minFilter = TextureFilter.Linear; parameter.fontParameters.size = fontParameter().size; return super.loadSync(manager, fileName, file, parameter); } diff --git a/core/src/io/anuke/mindustry/entities/Damage.java b/core/src/io/anuke/mindustry/entities/Damage.java index 9b75085b0f..f3a09e77b8 100644 --- a/core/src/io/anuke/mindustry/entities/Damage.java +++ b/core/src/io/anuke/mindustry/entities/Damage.java @@ -1,6 +1,7 @@ package io.anuke.mindustry.entities; import io.anuke.annotations.Annotations.Struct; +import io.anuke.arc.*; import io.anuke.arc.collection.GridBits; import io.anuke.arc.collection.IntQueue; import io.anuke.arc.function.*; @@ -11,10 +12,11 @@ import io.anuke.arc.util.Time; import io.anuke.mindustry.content.Bullets; import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.entities.Effects.Effect; -import io.anuke.mindustry.entities.bullet.Bullet; +import io.anuke.mindustry.entities.type.Bullet; import io.anuke.mindustry.entities.effect.Fire; import io.anuke.mindustry.entities.effect.Lightning; import io.anuke.mindustry.entities.type.Unit; +import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.gen.PropCell; @@ -187,6 +189,10 @@ public class Damage{ //TODO better velocity displacement float dst = tr.set(entity.x - x, entity.y - y).len(); entity.velocity().add(tr.setLength((1f - dst / radius) * 2f / entity.mass())); + + if(complete && damage >= 9999999f && entity == player){ + Events.fire(Trigger.exclusionDeath); + } }; rect.setSize(radius * 2).setCenter(x, y); diff --git a/core/src/io/anuke/mindustry/entities/Effects.java b/core/src/io/anuke/mindustry/entities/Effects.java index 16d1ddf83c..62bcd9a3ce 100644 --- a/core/src/io/anuke/mindustry/entities/Effects.java +++ b/core/src/io/anuke/mindustry/entities/Effects.java @@ -7,7 +7,7 @@ import io.anuke.arc.graphics.Color; import io.anuke.arc.math.Mathf; import io.anuke.arc.math.geom.Position; import io.anuke.arc.util.pooling.Pools; -import io.anuke.mindustry.entities.impl.EffectEntity; +import io.anuke.mindustry.entities.type.EffectEntity; import io.anuke.mindustry.entities.traits.ScaleTrait; public class Effects{ diff --git a/core/src/io/anuke/mindustry/entities/bullet/ArtilleryBulletType.java b/core/src/io/anuke/mindustry/entities/bullet/ArtilleryBulletType.java index 734c3f59a8..81da65344d 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/ArtilleryBulletType.java +++ b/core/src/io/anuke/mindustry/entities/bullet/ArtilleryBulletType.java @@ -4,6 +4,7 @@ import io.anuke.arc.graphics.g2d.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.Effects.*; +import io.anuke.mindustry.entities.type.Bullet; import io.anuke.mindustry.gen.*; //TODO scale velocity depending on fslope() @@ -20,7 +21,7 @@ public class ArtilleryBulletType extends BasicBulletType{ } @Override - public void update(Bullet b){ + public void update(io.anuke.mindustry.entities.type.Bullet b){ super.update(b); if(b.timer.get(0, 3 + b.fslope() * 2f)){ diff --git a/core/src/io/anuke/mindustry/entities/bullet/BasicBulletType.java b/core/src/io/anuke/mindustry/entities/bullet/BasicBulletType.java index 86b96ba7a8..8f54b58995 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/BasicBulletType.java +++ b/core/src/io/anuke/mindustry/entities/bullet/BasicBulletType.java @@ -4,6 +4,7 @@ import io.anuke.arc.Core; import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.TextureRegion; +import io.anuke.mindustry.entities.type.Bullet; import io.anuke.mindustry.graphics.Pal; /** An extended BulletType for most ammo-based bullets shot from turrets and units. */ diff --git a/core/src/io/anuke/mindustry/entities/bullet/BulletType.java b/core/src/io/anuke/mindustry/entities/bullet/BulletType.java index 693112d53f..58b186c28d 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/BulletType.java +++ b/core/src/io/anuke/mindustry/entities/bullet/BulletType.java @@ -7,6 +7,7 @@ import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.Effects.*; import io.anuke.mindustry.entities.effect.*; import io.anuke.mindustry.entities.traits.*; +import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; diff --git a/core/src/io/anuke/mindustry/entities/bullet/FlakBulletType.java b/core/src/io/anuke/mindustry/entities/bullet/FlakBulletType.java index 0a435d0bcb..3669909097 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/FlakBulletType.java +++ b/core/src/io/anuke/mindustry/entities/bullet/FlakBulletType.java @@ -4,6 +4,7 @@ import io.anuke.arc.math.geom.Rectangle; import io.anuke.arc.util.Time; import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.entities.Units; +import io.anuke.mindustry.entities.type.Bullet; public abstract class FlakBulletType extends BasicBulletType{ protected static Rectangle rect = new Rectangle(); diff --git a/core/src/io/anuke/mindustry/entities/bullet/LiquidBulletType.java b/core/src/io/anuke/mindustry/entities/bullet/LiquidBulletType.java index a2bdc677d1..186ea47425 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/LiquidBulletType.java +++ b/core/src/io/anuke/mindustry/entities/bullet/LiquidBulletType.java @@ -6,6 +6,7 @@ import io.anuke.arc.math.geom.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.effect.*; +import io.anuke.mindustry.entities.type.Bullet; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; @@ -35,7 +36,7 @@ public class LiquidBulletType extends BulletType{ } @Override - public void update(Bullet b){ + public void update(io.anuke.mindustry.entities.type.Bullet b){ super.update(b); if(liquid.canExtinguish()){ @@ -49,7 +50,7 @@ public class LiquidBulletType extends BulletType{ } @Override - public void draw(Bullet b){ + public void draw(io.anuke.mindustry.entities.type.Bullet b){ Draw.color(liquid.color, Color.white, b.fout() / 100f); Fill.circle(b.x, b.y, 0.5f + b.fout() * 2.5f); diff --git a/core/src/io/anuke/mindustry/entities/bullet/MassDriverBolt.java b/core/src/io/anuke/mindustry/entities/bullet/MassDriverBolt.java index 6344faee85..fe357b7f5f 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/MassDriverBolt.java +++ b/core/src/io/anuke/mindustry/entities/bullet/MassDriverBolt.java @@ -6,6 +6,7 @@ import io.anuke.arc.math.Angles; import io.anuke.arc.math.Mathf; import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.entities.Effects; +import io.anuke.mindustry.entities.type.Bullet; import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.world.blocks.distribution.MassDriver.DriverBulletData; @@ -23,7 +24,7 @@ public class MassDriverBolt extends BulletType{ } @Override - public void draw(Bullet b){ + public void draw(io.anuke.mindustry.entities.type.Bullet b){ float w = 11f, h = 13f; Draw.color(Pal.bulletYellowBack); @@ -36,7 +37,7 @@ public class MassDriverBolt extends BulletType{ } @Override - public void update(Bullet b){ + public void update(io.anuke.mindustry.entities.type.Bullet b){ //data MUST be an instance of DriverBulletData if(!(b.getData() instanceof DriverBulletData)){ hit(b); @@ -82,7 +83,7 @@ public class MassDriverBolt extends BulletType{ } @Override - public void despawned(Bullet b){ + public void despawned(io.anuke.mindustry.entities.type.Bullet b){ super.despawned(b); if(!(b.getData() instanceof DriverBulletData)) return; diff --git a/core/src/io/anuke/mindustry/entities/bullet/MissileBulletType.java b/core/src/io/anuke/mindustry/entities/bullet/MissileBulletType.java index 94220d1ece..06d05d1110 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/MissileBulletType.java +++ b/core/src/io/anuke/mindustry/entities/bullet/MissileBulletType.java @@ -5,6 +5,7 @@ import io.anuke.arc.math.Mathf; import io.anuke.arc.util.Time; import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.entities.Effects; +import io.anuke.mindustry.entities.type.Bullet; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.Pal; diff --git a/core/src/io/anuke/mindustry/entities/effect/Decal.java b/core/src/io/anuke/mindustry/entities/effect/Decal.java index dd8a499f50..103bc14919 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Decal.java +++ b/core/src/io/anuke/mindustry/entities/effect/Decal.java @@ -3,7 +3,7 @@ package io.anuke.mindustry.entities.effect; import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.math.Mathf; import io.anuke.mindustry.entities.EntityGroup; -import io.anuke.mindustry.entities.impl.TimedEntity; +import io.anuke.mindustry.entities.type.TimedEntity; import io.anuke.mindustry.entities.traits.BelowLiquidTrait; import io.anuke.mindustry.entities.traits.DrawTrait; import io.anuke.mindustry.graphics.Pal; diff --git a/core/src/io/anuke/mindustry/entities/effect/Fire.java b/core/src/io/anuke/mindustry/entities/effect/Fire.java index c5a0bd2119..31cc65ab6a 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Fire.java +++ b/core/src/io/anuke/mindustry/entities/effect/Fire.java @@ -8,9 +8,9 @@ import io.anuke.arc.math.geom.*; import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.impl.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.entities.type.TimedEntity; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; diff --git a/core/src/io/anuke/mindustry/entities/effect/GroundEffectEntity.java b/core/src/io/anuke/mindustry/entities/effect/GroundEffectEntity.java index 54094c4a87..4dfd0a694e 100644 --- a/core/src/io/anuke/mindustry/entities/effect/GroundEffectEntity.java +++ b/core/src/io/anuke/mindustry/entities/effect/GroundEffectEntity.java @@ -6,7 +6,7 @@ import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.Effects; import io.anuke.mindustry.entities.Effects.Effect; import io.anuke.mindustry.entities.Effects.EffectRenderer; -import io.anuke.mindustry.entities.impl.EffectEntity; +import io.anuke.mindustry.entities.type.EffectEntity; import io.anuke.mindustry.world.Tile; /** diff --git a/core/src/io/anuke/mindustry/entities/effect/ItemTransfer.java b/core/src/io/anuke/mindustry/entities/effect/ItemTransfer.java index aea1fe903f..888f7e7f60 100644 --- a/core/src/io/anuke/mindustry/entities/effect/ItemTransfer.java +++ b/core/src/io/anuke/mindustry/entities/effect/ItemTransfer.java @@ -10,7 +10,7 @@ import io.anuke.arc.math.geom.Vector2; import io.anuke.arc.util.Time; import io.anuke.arc.util.pooling.Pools; import io.anuke.mindustry.entities.EntityGroup; -import io.anuke.mindustry.entities.impl.TimedEntity; +import io.anuke.mindustry.entities.type.TimedEntity; import io.anuke.mindustry.entities.traits.DrawTrait; import io.anuke.mindustry.entities.type.Unit; import io.anuke.mindustry.graphics.Pal; diff --git a/core/src/io/anuke/mindustry/entities/effect/Lightning.java b/core/src/io/anuke/mindustry/entities/effect/Lightning.java index d4efb62d95..db8eeb5b1b 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Lightning.java +++ b/core/src/io/anuke/mindustry/entities/effect/Lightning.java @@ -12,8 +12,8 @@ import io.anuke.arc.util.pooling.Pools; import io.anuke.mindustry.content.Bullets; import io.anuke.mindustry.entities.EntityGroup; import io.anuke.mindustry.entities.Units; -import io.anuke.mindustry.entities.bullet.Bullet; -import io.anuke.mindustry.entities.impl.TimedEntity; +import io.anuke.mindustry.entities.type.Bullet; +import io.anuke.mindustry.entities.type.TimedEntity; import io.anuke.mindustry.entities.traits.DrawTrait; import io.anuke.mindustry.entities.traits.TimeTrait; import io.anuke.mindustry.entities.type.Unit; diff --git a/core/src/io/anuke/mindustry/entities/effect/Puddle.java b/core/src/io/anuke/mindustry/entities/effect/Puddle.java index b4d5091b43..69bb64c9c2 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Puddle.java +++ b/core/src/io/anuke/mindustry/entities/effect/Puddle.java @@ -14,11 +14,10 @@ import io.anuke.arc.util.pooling.Pool.Poolable; import io.anuke.arc.util.pooling.Pools; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.impl.SolidEntity; +import io.anuke.mindustry.entities.type.SolidEntity; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.game.TypeID; import io.anuke.mindustry.gen.Call; -import io.anuke.mindustry.net.Net; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.Tile; diff --git a/core/src/io/anuke/mindustry/entities/impl/BaseEntity.java b/core/src/io/anuke/mindustry/entities/type/BaseEntity.java similarity index 96% rename from core/src/io/anuke/mindustry/entities/impl/BaseEntity.java rename to core/src/io/anuke/mindustry/entities/type/BaseEntity.java index e2da48908e..ee938afd39 100755 --- a/core/src/io/anuke/mindustry/entities/impl/BaseEntity.java +++ b/core/src/io/anuke/mindustry/entities/type/BaseEntity.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.entities.impl; +package io.anuke.mindustry.entities.type; import io.anuke.mindustry.entities.EntityGroup; import io.anuke.mindustry.entities.traits.Entity; diff --git a/core/src/io/anuke/mindustry/entities/type/BaseUnit.java b/core/src/io/anuke/mindustry/entities/type/BaseUnit.java index 2d35ac82bd..4a9d8695f3 100644 --- a/core/src/io/anuke/mindustry/entities/type/BaseUnit.java +++ b/core/src/io/anuke/mindustry/entities/type/BaseUnit.java @@ -11,11 +11,12 @@ import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.entities.units.*; +import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.net.Net; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.blocks.defense.DeflectorWall.*; import io.anuke.mindustry.world.blocks.units.CommandCenter.*; import io.anuke.mindustry.world.blocks.units.UnitFactory.*; import io.anuke.mindustry.world.meta.*; @@ -79,6 +80,17 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ return type.typeID; } + @Override + public void onHit(SolidTrait entity){ + if(entity instanceof Bullet && ((Bullet)entity).getOwner() instanceof DeflectorEntity && player != null && getTeam() != player.getTeam()){ + Core.app.post(() -> { + if(isDead()){ + Events.fire(Trigger.phaseDeflectHit); + } + }); + } + } + public @Nullable Tile getSpawner(){ return world.tile(spawner); } diff --git a/core/src/io/anuke/mindustry/entities/bullet/Bullet.java b/core/src/io/anuke/mindustry/entities/type/Bullet.java similarity index 92% rename from core/src/io/anuke/mindustry/entities/bullet/Bullet.java rename to core/src/io/anuke/mindustry/entities/type/Bullet.java index b9eac5fd13..97051a2faa 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/Bullet.java +++ b/core/src/io/anuke/mindustry/entities/type/Bullet.java @@ -1,23 +1,19 @@ -package io.anuke.mindustry.entities.bullet; +package io.anuke.mindustry.entities.type; -import io.anuke.annotations.Annotations.Loc; -import io.anuke.annotations.Annotations.Remote; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.Rectangle; -import io.anuke.arc.math.geom.Vector2; +import io.anuke.annotations.Annotations.*; +import io.anuke.arc.math.*; +import io.anuke.arc.math.geom.*; import io.anuke.arc.util.*; -import io.anuke.arc.util.pooling.Pool.Poolable; -import io.anuke.arc.util.pooling.Pools; -import io.anuke.mindustry.entities.EntityGroup; -import io.anuke.mindustry.entities.effect.Lightning; -import io.anuke.mindustry.entities.impl.SolidEntity; +import io.anuke.arc.util.pooling.Pool.*; +import io.anuke.arc.util.pooling.*; +import io.anuke.mindustry.entities.*; +import io.anuke.mindustry.entities.bullet.*; +import io.anuke.mindustry.entities.effect.*; import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.entities.type.Unit; -import io.anuke.mindustry.game.Team; -import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.world.*; -import static io.anuke.mindustry.Vars.bulletGroup; -import static io.anuke.mindustry.Vars.world; +import static io.anuke.mindustry.Vars.*; public class Bullet extends SolidEntity implements DamageTrait, ScaleTrait, Poolable, DrawTrait, VelocityTrait, TimeTrait, TeamTrait, AbsorbTrait{ public Interval timer = new Interval(3); diff --git a/core/src/io/anuke/mindustry/entities/impl/DestructibleEntity.java b/core/src/io/anuke/mindustry/entities/type/DestructibleEntity.java similarity index 95% rename from core/src/io/anuke/mindustry/entities/impl/DestructibleEntity.java rename to core/src/io/anuke/mindustry/entities/type/DestructibleEntity.java index dce6f3dae5..350a47f9cf 100644 --- a/core/src/io/anuke/mindustry/entities/impl/DestructibleEntity.java +++ b/core/src/io/anuke/mindustry/entities/type/DestructibleEntity.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.entities.impl; +package io.anuke.mindustry.entities.type; import io.anuke.mindustry.entities.traits.*; diff --git a/core/src/io/anuke/mindustry/entities/impl/EffectEntity.java b/core/src/io/anuke/mindustry/entities/type/EffectEntity.java similarity index 97% rename from core/src/io/anuke/mindustry/entities/impl/EffectEntity.java rename to core/src/io/anuke/mindustry/entities/type/EffectEntity.java index 809cf89167..33b2f47475 100644 --- a/core/src/io/anuke/mindustry/entities/impl/EffectEntity.java +++ b/core/src/io/anuke/mindustry/entities/type/EffectEntity.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.entities.impl; +package io.anuke.mindustry.entities.type; import io.anuke.arc.graphics.Color; import io.anuke.arc.util.pooling.Pool.Poolable; diff --git a/core/src/io/anuke/mindustry/entities/type/Player.java b/core/src/io/anuke/mindustry/entities/type/Player.java index e1f44187fa..3f1fd7fde7 100644 --- a/core/src/io/anuke/mindustry/entities/type/Player.java +++ b/core/src/io/anuke/mindustry/entities/type/Player.java @@ -15,7 +15,6 @@ import io.anuke.mindustry.content.*; import io.anuke.mindustry.core.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; diff --git a/core/src/io/anuke/mindustry/entities/impl/SolidEntity.java b/core/src/io/anuke/mindustry/entities/type/SolidEntity.java similarity index 91% rename from core/src/io/anuke/mindustry/entities/impl/SolidEntity.java rename to core/src/io/anuke/mindustry/entities/type/SolidEntity.java index 544abdbefa..7dc6b0aa89 100644 --- a/core/src/io/anuke/mindustry/entities/impl/SolidEntity.java +++ b/core/src/io/anuke/mindustry/entities/type/SolidEntity.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.entities.impl; +package io.anuke.mindustry.entities.type; import io.anuke.arc.math.geom.Vector2; import io.anuke.mindustry.entities.traits.SolidTrait; diff --git a/core/src/io/anuke/mindustry/entities/type/TileEntity.java b/core/src/io/anuke/mindustry/entities/type/TileEntity.java index ae2e912467..30aa8b9cb7 100644 --- a/core/src/io/anuke/mindustry/entities/type/TileEntity.java +++ b/core/src/io/anuke/mindustry/entities/type/TileEntity.java @@ -8,8 +8,6 @@ import io.anuke.arc.math.geom.Point2; import io.anuke.arc.math.geom.Vector2; import io.anuke.arc.util.*; import io.anuke.mindustry.entities.EntityGroup; -import io.anuke.mindustry.entities.bullet.Bullet; -import io.anuke.mindustry.entities.impl.BaseEntity; import io.anuke.mindustry.entities.traits.HealthTrait; import io.anuke.mindustry.entities.traits.TargetTrait; import io.anuke.mindustry.game.*; diff --git a/core/src/io/anuke/mindustry/entities/impl/TimedEntity.java b/core/src/io/anuke/mindustry/entities/type/TimedEntity.java similarity index 93% rename from core/src/io/anuke/mindustry/entities/impl/TimedEntity.java rename to core/src/io/anuke/mindustry/entities/type/TimedEntity.java index e4007a5c4b..dbd74260fe 100644 --- a/core/src/io/anuke/mindustry/entities/impl/TimedEntity.java +++ b/core/src/io/anuke/mindustry/entities/type/TimedEntity.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.entities.impl; +package io.anuke.mindustry.entities.type; import io.anuke.arc.util.pooling.Pool.Poolable; import io.anuke.mindustry.entities.traits.ScaleTrait; diff --git a/core/src/io/anuke/mindustry/entities/type/Unit.java b/core/src/io/anuke/mindustry/entities/type/Unit.java index 77ef59bdb1..3dfd2e0364 100644 --- a/core/src/io/anuke/mindustry/entities/type/Unit.java +++ b/core/src/io/anuke/mindustry/entities/type/Unit.java @@ -11,7 +11,6 @@ import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.effect.*; -import io.anuke.mindustry.entities.impl.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.entities.units.*; import io.anuke.mindustry.game.EventType.*; @@ -110,6 +109,10 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ drownTime = 0f; status.clear(); Events.fire(new UnitDestroyEvent(this)); + + if(explosiveness > 7f && this == player){ + Events.fire(Trigger.suicideBomb); + } } @Override @@ -310,6 +313,9 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ if(drownTime >= 0.999f && !net.client()){ damage(health + 1); + if(this == player){ + Events.fire(Trigger.drown); + } } float px = x, py = y; diff --git a/core/src/io/anuke/mindustry/game/EventType.java b/core/src/io/anuke/mindustry/game/EventType.java index 4e05c1665b..aa04c47ef9 100644 --- a/core/src/io/anuke/mindustry/game/EventType.java +++ b/core/src/io/anuke/mindustry/game/EventType.java @@ -3,21 +3,29 @@ package io.anuke.mindustry.game; import io.anuke.annotations.Annotations.*; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.entities.traits.BuilderTrait; -import io.anuke.mindustry.entities.type.Unit; -import io.anuke.mindustry.type.Zone; +import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.entities.units.*; +import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.entities.type.Player; public class EventType{ //events that occur very often public enum Trigger{ shock, + phaseDeflectHit, impactPower, thoriumReactorOverheat, itemLaunch, fireExtinguish, - newGame + newGame, + tutorialComplete, + flameAmmo, + turretCool, + enablePixelation, + drown, + exclusionDeath, + suicideBomb } public static class WinEvent{} @@ -30,6 +38,16 @@ public class EventType{ public static class MapPublishEvent{} + public static class CommandIssueEvent{ + public final Tile tile; + public final UnitCommand command; + + public CommandIssueEvent(Tile tile, UnitCommand command){ + this.tile = tile; + this.command = command; + } + } + public static class PlayerChatEvent{ public final Player player; public final String message; @@ -149,6 +167,14 @@ public class EventType{ } } + public static class ResearchEvent{ + public final UnlockableContent content; + + public ResearchEvent(UnlockableContent content){ + this.content = content; + } + } + /** * Called when block building begins by placing down the BuildBlock. * The tile's block will nearly always be a BuildBlock. @@ -215,10 +241,29 @@ public class EventType{ } } + public static class UnitCreateEvent{ + public final BaseUnit unit; + + public UnitCreateEvent(BaseUnit unit){ + this.unit = unit; + } + } + public static class ResizeEvent{ } - + + public static class MechChangeEvent{ + public final Player player; + public final Mech mech; + + public MechChangeEvent(Player player, Mech mech){ + this.player = player; + this.mech = mech; + } + } + + /** Called after connecting; when a player recieves world data and is ready to play.*/ public static class PlayerJoin{ public final Player player; @@ -226,7 +271,16 @@ public class EventType{ this.player = player; } } - + + /** Called when a player connects, but has not joined the game yet.*/ + public static class PlayerConnect{ + public final Player player; + + public PlayerConnect(Player player){ + this.player = player; + } + } + public static class PlayerLeave{ public final Player player; diff --git a/core/src/io/anuke/mindustry/game/Tutorial.java b/core/src/io/anuke/mindustry/game/Tutorial.java index b5a7f51880..d2534c151b 100644 --- a/core/src/io/anuke/mindustry/game/Tutorial.java +++ b/core/src/io/anuke/mindustry/game/Tutorial.java @@ -177,6 +177,7 @@ public class Tutorial{ state.wave = 5; //end tutorial, never show it again + Events.fire(Trigger.tutorialComplete); Core.settings.put("playedtutorial", true); Core.settings.save(); } diff --git a/core/src/io/anuke/mindustry/io/TypeIO.java b/core/src/io/anuke/mindustry/io/TypeIO.java index 25d6f92bec..1d17e0bc44 100644 --- a/core/src/io/anuke/mindustry/io/TypeIO.java +++ b/core/src/io/anuke/mindustry/io/TypeIO.java @@ -5,7 +5,7 @@ import io.anuke.annotations.Annotations.WriteClass; import io.anuke.arc.graphics.Color; import io.anuke.mindustry.entities.Effects; import io.anuke.mindustry.entities.Effects.Effect; -import io.anuke.mindustry.entities.bullet.Bullet; +import io.anuke.mindustry.entities.type.Bullet; import io.anuke.mindustry.entities.bullet.BulletType; import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest; import io.anuke.mindustry.entities.traits.ShooterTrait; diff --git a/core/src/io/anuke/mindustry/io/versions/LegacyTypeTable.java b/core/src/io/anuke/mindustry/io/versions/LegacyTypeTable.java index 6205313247..9af7e9f785 100644 --- a/core/src/io/anuke/mindustry/io/versions/LegacyTypeTable.java +++ b/core/src/io/anuke/mindustry/io/versions/LegacyTypeTable.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.io.versions; import io.anuke.arc.function.Supplier; -import io.anuke.mindustry.entities.bullet.Bullet; +import io.anuke.mindustry.entities.type.Bullet; import io.anuke.mindustry.entities.effect.*; import io.anuke.mindustry.entities.type.Player; import io.anuke.mindustry.entities.type.base.*; diff --git a/core/src/io/anuke/mindustry/type/Loadout.java b/core/src/io/anuke/mindustry/type/Loadout.java index 05339c3d1b..136018acc2 100644 --- a/core/src/io/anuke/mindustry/type/Loadout.java +++ b/core/src/io/anuke/mindustry/type/Loadout.java @@ -8,6 +8,7 @@ import io.anuke.mindustry.world.blocks.storage.*; import static io.anuke.mindustry.Vars.*; +//TODO this class is a disappointment public class Loadout extends Content{ private final Array outArray = new Array<>(); private final IntMap entries = new IntMap(){{ diff --git a/core/src/io/anuke/mindustry/type/Weapon.java b/core/src/io/anuke/mindustry/type/Weapon.java index 6f8886dd11..980859c01d 100644 --- a/core/src/io/anuke/mindustry/type/Weapon.java +++ b/core/src/io/anuke/mindustry/type/Weapon.java @@ -13,6 +13,7 @@ import io.anuke.mindustry.entities.Effects.*; import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.entities.type.Bullet; import io.anuke.mindustry.gen.*; import static io.anuke.mindustry.Vars.net; diff --git a/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java index 427aaded51..28226b215d 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -14,6 +14,7 @@ import io.anuke.arc.scene.ui.TextButton.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; import io.anuke.mindustry.core.GameState.*; +import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.ui.*; @@ -287,7 +288,11 @@ public class SettingsMenuDialog extends SettingsDialog{ } graphics.checkPref("bloom", false, val -> renderer.toggleBloom(val)); graphics.checkPref("lasers", true); - graphics.checkPref("pixelate", false); + graphics.checkPref("pixelate", false, val -> { + if(val){ + Events.fire(Trigger.enablePixelation); + } + }); graphics.checkPref("linear", false, b -> { for(Texture tex : Core.atlas.getTextures()){ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java index 0e7184df3f..21e5f76ce2 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java @@ -15,6 +15,7 @@ import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.content.TechTree.*; +import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; @@ -235,6 +236,7 @@ public class TechTreeDialog extends FloatingDialog{ rebuild(); Core.scene.act(); Sounds.unlock.play(); + Events.fire(new ResearchEvent(node.block)); } void rebuild(){ diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index 789c63943b..a338a189c8 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -17,9 +17,9 @@ import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; import io.anuke.arc.util.pooling.*; import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.entities.effect.*; import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.entities.type.Bullet; import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; diff --git a/core/src/io/anuke/mindustry/world/Build.java b/core/src/io/anuke/mindustry/world/Build.java index a97a310922..bb08372000 100644 --- a/core/src/io/anuke/mindustry/world/Build.java +++ b/core/src/io/anuke/mindustry/world/Build.java @@ -86,7 +86,6 @@ public class Build{ } } - Tile tile = world.tile(x, y); if(tile == null) return false; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/DeflectorWall.java b/core/src/io/anuke/mindustry/world/blocks/defense/DeflectorWall.java index 87b4b00248..de358e7b53 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/DeflectorWall.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/DeflectorWall.java @@ -1,15 +1,13 @@ package io.anuke.mindustry.world.blocks.defense; -import io.anuke.arc.graphics.Blending; -import io.anuke.arc.graphics.Color; +import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.Mathf; +import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.util.*; -import io.anuke.mindustry.entities.bullet.Bullet; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.game.Team; -import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.entities.type.Bullet; +import io.anuke.mindustry.world.*; import static io.anuke.mindustry.Vars.tilesize; @@ -67,7 +65,7 @@ public class DeflectorWall extends Wall{ } //bullet.updateVelocity(); - bullet.resetOwner(entity, Team.derelict); + bullet.resetOwner(entity, entity.getTeam()); bullet.scaleTime(1f); bullet.deflect(); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java b/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java index da75cccd7d..4107281512 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java @@ -8,9 +8,9 @@ import io.anuke.arc.math.*; import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.impl.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.entities.type.BaseEntity; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.consumers.*; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/SurgeWall.java b/core/src/io/anuke/mindustry/world/blocks/defense/SurgeWall.java index d7cd84b321..0f51c74b40 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/SurgeWall.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/SurgeWall.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.world.blocks.defense; import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.entities.bullet.Bullet; +import io.anuke.mindustry.entities.type.Bullet; import io.anuke.mindustry.entities.effect.Lightning; import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.graphics.Pal; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ArtilleryTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ArtilleryTurret.java index 62b2770407..53ba8cbad4 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ArtilleryTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ArtilleryTurret.java @@ -3,7 +3,7 @@ package io.anuke.mindustry.world.blocks.defense.turrets; import io.anuke.arc.math.Mathf; import io.anuke.arc.math.geom.Vector2; import io.anuke.mindustry.entities.Predict; -import io.anuke.mindustry.entities.bullet.Bullet; +import io.anuke.mindustry.entities.type.Bullet; import io.anuke.mindustry.entities.bullet.BulletType; import io.anuke.mindustry.world.Tile; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java index 1e0f0a3d64..7ed149ba2e 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java @@ -1,15 +1,16 @@ package io.anuke.mindustry.world.blocks.defense.turrets; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.content.Fx; -import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.entities.Effects.Effect; -import io.anuke.mindustry.type.Liquid; -import io.anuke.mindustry.world.Tile; +import io.anuke.arc.*; +import io.anuke.arc.math.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.entities.*; +import io.anuke.mindustry.entities.Effects.*; +import io.anuke.mindustry.game.EventType.*; +import io.anuke.mindustry.type.*; +import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.consumers.*; -import io.anuke.mindustry.world.meta.BlockStat; -import io.anuke.mindustry.world.meta.StatUnit; +import io.anuke.mindustry.world.meta.*; import static io.anuke.mindustry.Vars.tilesize; @@ -35,6 +36,15 @@ public class CooledTurret extends Turret{ stats.add(BlockStat.boostEffect, 1f + maxUsed * coolantMultiplier, StatUnit.timesSpeed); } + @Override + public void handleLiquid(Tile tile, Tile source, Liquid liquid, float amount){ + if(tile.entity.liquids.currentAmount() <= 0.001f){ + Events.fire(Trigger.turretCool); + } + + super.handleLiquid(tile, source, liquid, amount); + } + @Override protected void updateShooting(Tile tile){ super.updateShooting(tile); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java index f0d3737d8d..5fb442c4d8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java @@ -4,6 +4,7 @@ import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.mindustry.*; +import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.EventType.*; @@ -111,6 +112,10 @@ public class ItemTurret extends CooledTurret{ TurretEntity entity = tile.entity(); if(entity == null) return; + if(item == Items.pyratite){ + Events.fire(Trigger.flameAmmo); + } + BulletType type = ammo.get(item); entity.totalAmmo += type.ammoMultiplier; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java index 7cfec5e8be..b33b21a55d 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java @@ -4,7 +4,7 @@ import io.anuke.arc.math.Angles; import io.anuke.arc.math.Mathf; import io.anuke.arc.util.Time; import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.entities.bullet.Bullet; +import io.anuke.mindustry.entities.type.Bullet; import io.anuke.mindustry.entities.bullet.BulletType; import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.type.Liquid; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java index 761f8d1c81..ba3e8dda79 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java @@ -15,7 +15,7 @@ import io.anuke.arc.util.Time; import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.Effects.Effect; -import io.anuke.mindustry.entities.bullet.Bullet; +import io.anuke.mindustry.entities.type.Bullet; import io.anuke.mindustry.entities.bullet.BulletType; import io.anuke.mindustry.entities.traits.TargetTrait; import io.anuke.mindustry.entities.type.TileEntity; diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java b/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java index cd579d61eb..2bce0d1904 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java @@ -11,8 +11,8 @@ import io.anuke.arc.util.pooling.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.Effects.*; -import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.entities.type.Bullet; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java index f176c81c33..d09edf82ab 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java @@ -72,7 +72,7 @@ public class CoreBlock extends StorageBlock{ @Override public int getMaximumAccepted(Tile tile, Item item){ CoreEntity entity = tile.entity(); - return item.type == ItemType.material ? entity.storageCapacity : entity.storageCapacity; + return item.type == ItemType.material ? entity.storageCapacity : 0; } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/LaunchPad.java b/core/src/io/anuke/mindustry/world/blocks/storage/LaunchPad.java index 32caf3ce27..d432944ea4 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/LaunchPad.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/LaunchPad.java @@ -48,7 +48,7 @@ public class LaunchPad extends StorageBlock{ public void draw(Tile tile){ super.draw(tile); - float progress = Mathf.clamp((tile.entity.items.total() / (float)itemCapacity) * ((tile.entity.timer.getTime(timerLaunch) / (launchTime / tile.entity.timeScale)))); + float progress = Mathf.clamp(Mathf.clamp((tile.entity.items.total() / (float)itemCapacity)) * ((tile.entity.timer.getTime(timerLaunch) / (launchTime / tile.entity.timeScale)))); float scale = size / 3f; Lines.stroke(2f); @@ -59,7 +59,7 @@ public class LaunchPad extends StorageBlock{ if(tile.entity.cons.valid()){ for(int i = 0; i < 3; i++){ - float f = (Time.time() / 100f + i * 0.5f) % 1f; + float f = (Time.time() / 200f + i * 0.5f) % 1f; Lines.stroke(((2f * (2f - Math.abs(0.5f - f) * 2f)) - 2f + 0.2f)); Lines.poly(tile.drawx(), tile.drawy(), 4, (1f - f) * 10f * scale); diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java b/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java index 80d1fa405f..52cefd9a19 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java @@ -59,7 +59,7 @@ public class Unloader extends Block{ if(tile.entity.timer.get(timerUnload, speed / entity.timeScale) && tile.entity.items.total() == 0){ for(Tile other : tile.entity.proximity()){ - if(other.interactable(tile.getTeam()) && other.block().unloadable && entity.items.total() == 0 && + if(other.interactable(tile.getTeam()) && other.block().unloadable && other.block().hasItems && entity.items.total() == 0 && ((entity.sortItem == null && other.entity.items.total() > 0) || hasItem(other, entity.sortItem))){ offloadNear(tile, removeItem(other, entity.sortItem)); } diff --git a/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java b/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java index b5d930789c..317158d858 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java @@ -14,6 +14,7 @@ import io.anuke.mindustry.entities.Effects.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.entities.units.*; import io.anuke.mindustry.game.*; +import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.ui.*; @@ -105,6 +106,8 @@ public class CommandCenter extends Block{ for(BaseUnit unit : unitGroups[team.ordinal()].all()){ unit.onCommand(command); } + + Events.fire(new CommandIssueEvent(tile, command)); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java b/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java index b8388d822f..1a498de817 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java @@ -1,6 +1,7 @@ package io.anuke.mindustry.world.blocks.units; import io.anuke.annotations.Annotations.*; +import io.anuke.arc.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; @@ -9,6 +10,7 @@ import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; @@ -68,10 +70,14 @@ public class MechPad extends Block{ boolean resetSpawner = !entity.sameMech && entity.player.mech == mech; entity.player.mech = !entity.sameMech && entity.player.mech == mech ? Mechs.starter : mech; + Player player = entity.player; + entity.progress = 0; entity.player.onRespawn(tile); if(resetSpawner) entity.player.lastSpawner = null; entity.player = null; + + Events.fire(new MechChangeEvent(player, player.mech)); } protected static boolean checkValidTap(Tile tile, Player player){ diff --git a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java index 1b212ebfaa..9de6fc9235 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.world.blocks.units; import io.anuke.annotations.Annotations.Loc; import io.anuke.annotations.Annotations.Remote; -import io.anuke.arc.Core; +import io.anuke.arc.*; import io.anuke.arc.collection.EnumSet; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.Mathf; @@ -10,6 +10,7 @@ import io.anuke.mindustry.Vars; import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.entities.Effects; import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.graphics.Shaders; @@ -60,6 +61,7 @@ public class UnitFactory extends Block{ unit.set(tile.drawx() + Mathf.range(4), tile.drawy() + Mathf.range(4)); unit.add(); unit.velocity().y = factory.launchVelocity; + Events.fire(new UnitCreateEvent(unit)); } } diff --git a/desktop/src/io/anuke/mindustry/desktop/steam/SAchievement.java b/desktop/src/io/anuke/mindustry/desktop/steam/SAchievement.java index 113ddddb8b..bee3f92e62 100644 --- a/desktop/src/io/anuke/mindustry/desktop/steam/SAchievement.java +++ b/desktop/src/io/anuke/mindustry/desktop/steam/SAchievement.java @@ -1,35 +1,84 @@ package io.anuke.mindustry.desktop.steam; -import io.anuke.arc.function.*; - public enum SAchievement{ + completeTutorial, + kill1kEnemies(SStat.enemiesDestroyed, 1000), + kill100kEnemies(SStat.enemiesDestroyed, 1000 * 100), + launch10kItems(SStat.itemsLaunched, 1000 * 10), + launch1milItems(SStat.itemsLaunched, 1000 * 1000), + beat10Attack(SStat.attacksWon, 10), + win10PvPMatches(SStat.pvpsWon, 10), + defeatAttack5Waves, + launch30Times(SStat.timesLaunched, 30), + survive100Waves(SStat.maxWavesSurvived, 100), + survive500Waves(SStat.maxWavesSurvived, 500), + researchAll, + useAllMechs, + shockWetEnemy, + killEnemyPhaseWall, + researchLaunchPad, + researchRouter, + place10kBlocks(SStat.blocksBuilt, 10 * 1000), + destroy1kBlocks(SStat.blocksDestroyed, 1000), + overheatReactorCampaign(SStat.reactorsOverheated, 1), + make10maps(SStat.mapsMade, 10), + downloadMapWorkshop, + publishMap(SStat.mapsPublished, 1), + defeatBoss(SStat.bossesDefeated, 1), + configAllZones, + drop10kitems, + powerupImpactReactor, + obtainThorium, + obtainTitanium, + suicideBomb, + buildDaggerFactory, + issueAttackcommand, + active100Units(SStat.maxUnitActive, 100), + active10Phantoms, + active50Crawlers, + build1000Units, + earnSRank, + earnSSRank, + dieExclusion, + drown, + fillCoreAllCampaign, + hostServer10, + buildMeltdownSpectre, + launchItemPad, + skipLaunching2Death, + chainRouters, + survive10WavesNoBlocks, + useFlameAmmo, + coolTurret, + enablePixelation, ; - private final BooleanProvider completed; - + private final SStat stat; + private final int statGoal; public static final SAchievement[] all = values(); - SAchievement(BooleanProvider completed){ - this.completed = completed; - } - /** Creates an achievement that is triggered when this stat reaches a number.*/ - SAchievement(SStat stat, int required){ - this(() -> stat.get() >= required); + SAchievement(SStat stat, int goal){ + this.stat = stat; + this.statGoal = goal; } - public void checkCompletion(){ - if(!achieved() && conditionsMet()){ + SAchievement(){ + this(null, 0); + } + + public void complete(){ + if(!achieved()){ SVars.stats.stats.setAchievement(name()); SVars.stats.stats.storeStats(); } } + public void checkCompletion(){ + //TODO + } + public boolean achieved(){ return SVars.stats.stats.isAchieved(name(), false); } - - public boolean conditionsMet(){ - return completed.get(); - } } diff --git a/desktop/src/io/anuke/mindustry/desktop/steam/SStat.java b/desktop/src/io/anuke/mindustry/desktop/steam/SStat.java index bdf6df5dee..27416a4be1 100644 --- a/desktop/src/io/anuke/mindustry/desktop/steam/SStat.java +++ b/desktop/src/io/anuke/mindustry/desktop/steam/SStat.java @@ -5,6 +5,7 @@ public enum SStat{ attacksWon, pvpsWon, gamesWon, + timesLaunched, maxWavesSurvived, zoneMechsUsed, enemiesDestroyed, @@ -26,6 +27,12 @@ public enum SStat{ return SVars.stats.stats.getStatI(name(), 0); } + public void max(int amount){ + if(amount > get()){ + add(amount - get()); + } + } + public void add(int amount){ SVars.stats.stats.setStatI(name(), get() + amount); SVars.stats.onUpdate(); diff --git a/desktop/src/io/anuke/mindustry/desktop/steam/SStats.java b/desktop/src/io/anuke/mindustry/desktop/steam/SStats.java index 02ce2af331..3165ba1d26 100644 --- a/desktop/src/io/anuke/mindustry/desktop/steam/SStats.java +++ b/desktop/src/io/anuke/mindustry/desktop/steam/SStats.java @@ -1,24 +1,256 @@ package io.anuke.mindustry.desktop.steam; import com.codedisaster.steamworks.*; +import io.anuke.arc.*; +import io.anuke.arc.collection.*; import io.anuke.arc.util.*; +import io.anuke.mindustry.*; +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.entities.units.*; +import io.anuke.mindustry.game.EventType.*; +import io.anuke.mindustry.game.Stats.*; +import io.anuke.mindustry.type.*; +import io.anuke.mindustry.world.*; +import static io.anuke.mindustry.Vars.*; +import static io.anuke.mindustry.desktop.steam.SAchievement.*; + +@SuppressWarnings("unchecked") public class SStats implements SteamUserStatsCallback{ public final SteamUserStats stats = new SteamUserStats(this); //todo store stats periodically private boolean updated = false; + private ObjectSet mechs = new ObjectSet<>(); public SStats(){ stats.requestCurrentStats(); + + Events.on(ClientLoadEvent.class, e -> { + mechs = Core.settings.getObject("mechs", ObjectSet.class, ObjectSet::new); + + Core.app.addListener(new ApplicationListener(){ + Interval i = new Interval(); + @Override + public void update(){ + if(i.get(60f / 4f)){ + checkUpdate(); + } + } + }); + }); } public void onUpdate(){ this.updated = true; } - private void registerEvents(){ + private void checkUpdate(){ + if(campaign()){ + SStat.maxUnitActive.max(unitGroups[player.getTeam().ordinal()].size()); + if(unitGroups[player.getTeam().ordinal()].count(u -> u.getType() == UnitTypes.phantom) >= 10){ + active10Phantoms.achieved(); + } + + if(unitGroups[player.getTeam().ordinal()].count(u -> u.getType() == UnitTypes.crawler) >= 50){ + active50Crawlers.achieved(); + } + + for(Tile tile : state.teams.get(player.getTeam()).cores){ + if(!content.items().contains(i -> i.type == ItemType.material && tile.entity.items.get(i) < tile.block().itemCapacity)){ + fillCoreAllCampaign.achieved(); + break; + } + } + } + } + + private void registerEvents(){ + Events.on(UnitDestroyEvent.class, e -> { + if(ncustom()){ + if(e.unit.getTeam() != Vars.player.getTeam()){ + SStat.enemiesDestroyed.add(); + + if(e.unit instanceof BaseUnit && ((BaseUnit)e.unit).isBoss()){ + SStat.bossesDefeated.add(); + } + } + } + }); + + Events.on(ZoneConfigureCompleteEvent.class, e -> { + if(!content.zones().contains(z -> !z.canConfigure())){ + configAllZones.achieved(); + } + }); + + Events.on(Trigger.newGame, () -> Core.app.post(() -> { + if(campaign() && player.getClosestCore() != null && player.getClosestCore().items.total() >= 10 * 1000){ + drop10kitems.achieved(); + } + })); + + Events.on(CommandIssueEvent.class, e -> { + if(campaign() && e.command == UnitCommand.attack){ + issueAttackcommand.achieved(); + } + }); + + Events.on(BlockBuildEndEvent.class, e -> { + if(campaign() && e.player == player && !e.breaking){ + SStat.blocksBuilt.add(); + + if(e.tile.block() == Blocks.router && e.tile.entity.proximity().contains(t -> t.block() == Blocks.router)){ + chainRouters.achieved(); + } + + if(e.tile.block() == Blocks.daggerFactory){ + buildDaggerFactory.achieved(); + } + + if(e.tile.block() == Blocks.meltdown || e.tile.block() == Blocks.spectre){ + if(e.tile.block() == Blocks.meltdown && !Core.settings.getBool("meltdownp", false)){ + Core.settings.putSave("meltdownp", true); + } + + if(e.tile.block() == Blocks.spectre && !Core.settings.getBool("spectrep", false)){ + Core.settings.putSave("spectrep", true); + } + + if(Core.settings.getBool("meltdownp", false) && Core.settings.getBool("spectrep", false)){ + buildMeltdownSpectre.achieved(); + } + } + } + }); + + Events.on(BlockDestroyEvent.class, e -> { + if(campaign() && e.tile.getTeam() != player.getTeam()){ + SStat.blocksDestroyed.add(); + } + }); + + Events.on(MapMakeEvent.class, e -> SStat.mapsMade.add()); + + Events.on(MapPublishEvent.class, e -> SStat.mapsPublished.add()); + + Events.on(UnlockEvent.class, e -> { + if(e.content == Items.thorium) obtainThorium.achieved(); + if(e.content == Items.titanium) obtainTitanium.achieved(); + }); + + Events.on(Trigger.exclusionDeath, dieExclusion::achieved); + + Events.on(Trigger.drown, drown::achieved); + + Events.on(Trigger.impactPower, powerupImpactReactor::achieved); + + Events.on(Trigger.flameAmmo, useFlameAmmo::achieved); + + Events.on(Trigger.turretCool, coolTurret::achieved); + + Events.on(Trigger.enablePixelation, enablePixelation::achieved); + + Events.on(Trigger.suicideBomb, suicideBomb::achieved); + + Events.on(Trigger.thoriumReactorOverheat, SStat.reactorsOverheated::add); + + Events.on(Trigger.tutorialComplete, completeTutorial::achieved); + + Events.on(Trigger.shock, shockWetEnemy::achieved); + + Events.on(Trigger.phaseDeflectHit, killEnemyPhaseWall::achieved); + + Events.on(Trigger.itemLaunch, launchItemPad::achieved); + + Events.on(UnitCreateEvent.class, e -> { + if(campaign() && e.unit.getTeam() == player.getTeam()){ + SStat.unitsBuilt.add(); + } + }); + + Events.on(LoseEvent.class, e -> { + if(campaign()){ + if(world.getZone().metCondition() && (state.wave - world.getZone().conditionWave) / world.getZone().launchPeriod >= 1){ + skipLaunching2Death.achieved(); + } + } + }); + + Events.on(LaunchEvent.class, e -> { + int total = 0; + for(Item item : Vars.content.items()){ + total += Vars.state.stats.itemsDelivered.get(item, 0); + } + + SStat.timesLaunched.add(); + SStat.itemsLaunched.add(total); + }); + + Events.on(WaveEvent.class, e -> { + if(ncustom()){ + SStat.maxWavesSurvived.max(Vars.state.wave); + + if(state.stats.buildingsBuilt == 0 && state.wave >= 10){ + survive10WavesNoBlocks.achieved(); + } + } + }); + + Events.on(PlayerJoin.class, e -> { + if(Vars.net.server()){ + SStat.maxPlayersServer.max(Vars.playerGroup.size()); + } + }); + + Events.on(ResearchEvent.class, e -> { + if(e.content == Blocks.router) researchRouter.achieved(); + if(e.content == Blocks.launchPad) researchLaunchPad.achieved(); + + if(!TechTree.all.contains(t -> t.block.locked())){ + researchAll.achieved(); + } + }); + + Events.on(WinEvent.class, e -> { + if(campaign()){ + if(Vars.state.wave <= 5){ + defeatAttack5Waves.achieved(); + } + + if(Vars.state.rules.attackMode){ + SStat.attacksWon.add(); + } + + RankResult result = state.stats.calculateRank(world.getZone(), state.launched); + if(result.rank == Rank.S) earnSRank.achieved(); + if(result.rank == Rank.SS) earnSSRank.achieved(); + } + + if(state.rules.pvp){ + SStat.pvpsWon.add(); + } + }); + + Events.on(MechChangeEvent.class, e -> { + if(campaign()){ + if(mechs.add(e.mech.name)){ + SStat.zoneMechsUsed.max(mechs.size); + Core.settings.putObject("mechs", mechs); + Core.settings.save(); + } + } + }); + } + + private boolean ncustom(){ + return campaign(); + } + + private boolean campaign(){ + return Vars.world.isZone(); } @Override diff --git a/desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java b/desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java index eda2b902af..ee27641181 100644 --- a/desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java +++ b/desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java @@ -31,7 +31,7 @@ public class SWorkshop implements SteamUGCCallback{ @Override public void onSubscribeItem(SteamPublishedFileID publishedFileID, SteamResult result){ - + SAchievement.downloadMapWorkshop.achieved(); } @Override @@ -110,6 +110,7 @@ public class SWorkshop implements SteamUGCCallback{ @Override public void onDownloadItemResult(int appID, SteamPublishedFileID publishedFileID, SteamResult result){ + SAchievement.downloadMapWorkshop.achieved(); ItemInstallInfo info = new ItemInstallInfo(); ugc.getItemInstallInfo(publishedFileID, info); Log.info("Item downloaded to {0}", info.getFolder()); diff --git a/gradle.properties b/gradle.properties index f02f679666..288add54c5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=41590404d0897e36fbe82cf9975d0af1c8e3397a +archash=128a1ae19bb28b1aebeb9732bf178688fd129b23