From 1d0cfd4435456536f824a5abb592dcd14a0eb6d5 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 4 Feb 2020 11:40:56 -0500 Subject: [PATCH] UnitType cleanup --- .../annotations/impl/EntityProcess.java | 4 +- .../mindustry/entities/def/EntityComps.java | 40 ++++- .../entities/type/base/BaseDrone.java | 4 +- .../entities/type/base/BuilderDrone.java | 6 +- .../entities/type/base/FlyingUnit.java | 11 +- .../entities/type/base/GroundUnit.java | 11 +- .../entities/type/base/MinerDrone.java | 2 +- .../entities/type/base/RepairDrone.java | 2 +- .../entities/units/AIController.java | 4 + .../entities/units/StateMachine.java | 11 ++ .../mindustry/entities/units/Statuses.java | 149 ------------------ .../entities/units/UnitController.java | 9 +- .../mindustry/entities/units/UnitDrops.java | 47 ------ .../mindustry/entities/units/UnitState.java | 12 -- 14 files changed, 76 insertions(+), 236 deletions(-) create mode 100644 core/src/mindustry/entities/units/AIController.java delete mode 100644 core/src/mindustry/entities/units/Statuses.java delete mode 100644 core/src/mindustry/entities/units/UnitDrops.java delete mode 100644 core/src/mindustry/entities/units/UnitState.java diff --git a/annotations/src/main/java/mindustry/annotations/impl/EntityProcess.java b/annotations/src/main/java/mindustry/annotations/impl/EntityProcess.java index 4288a7ff30..6a63b40d1b 100644 --- a/annotations/src/main/java/mindustry/annotations/impl/EntityProcess.java +++ b/annotations/src/main/java/mindustry/annotations/impl/EntityProcess.java @@ -248,8 +248,8 @@ public class EntityProcess extends BaseProcessor{ if(method.name().length() <= 3) continue; String var = Strings.camelize(method.name().substring(method.name().startsWith("is") ? 2 : 3)); - //make sure it's a real variable - if(!Array.with(def.builder.fieldSpecs).contains(f -> f.name.equals(var))) continue; + //make sure it's a real variable AND that the component doesn't already implement it with custom logic + if(!Array.with(def.builder.fieldSpecs).contains(f -> f.name.equals(var)) || comp.methods().contains(m -> m.name().equals(method.name()))) continue; if(method.name().startsWith("get") || method.name().startsWith("is")){ def.builder.addMethod(MethodSpec.overriding(method.e).addStatement("return " + var).build()); diff --git a/core/src/mindustry/entities/def/EntityComps.java b/core/src/mindustry/entities/def/EntityComps.java index 4edc4e408e..3d10ded583 100644 --- a/core/src/mindustry/entities/def/EntityComps.java +++ b/core/src/mindustry/entities/def/EntityComps.java @@ -43,14 +43,37 @@ import static mindustry.Vars.*; public class EntityComps{ @Component - abstract class UnitComp implements Healthc, Velc, Statusc, Teamc, Itemsc, Hitboxc, Rotc, Massc{ - UnitDef type; - UnitController controller; + abstract class UnitComp implements Healthc, Velc, Statusc, Teamc, Itemsc, Hitboxc, Rotc, Massc, Unitc, Weaponsc{ + private UnitController controller; + private UnitDef type; - float getBounds(){ + public float getBounds(){ return getHitSize() * 2f; } + public void setController(UnitController controller){ + this.controller = controller; + controller.set(this); + } + + public UnitController getController(){ + return controller; + } + + public void set(UnitDef def, UnitController controller){ + setType(type); + setController(controller); + } + + public void setType(UnitDef type){ + this.type = type; + setupWeapons(type); + } + + public UnitDef getType(){ + return type; + } + public void update(){ //apply knockback based on spawns //TODO move elsewhere @@ -97,7 +120,7 @@ public class EntityComps{ Damage.dynamicExplosion(getX(), getY(), flammability, explosiveness, 0f, getBounds() / 2f, Pal.darkFlame); //TODO cleanup - ScorchDecal.create(getX(), getY()); + //ScorchDecal.create(getX(), getY()); Fx.explosion.at(this); Effects.shake(2f, 2f, this); @@ -617,7 +640,7 @@ public class EntityComps{ /** weapon mount array, never null */ WeaponMount[] mounts = {}; - void init(UnitDef def){ + void setupWeapons(UnitDef def){ mounts = new WeaponMount[def.weapons.size]; for(int i = 0; i < mounts.length; i++){ mounts[i] = new WeaponMount(def.weapons.get(i)); @@ -811,6 +834,11 @@ public class EntityComps{ Draw.rect(region, getX(), getY(), getRotation()); Draw.color(); } + + public float clipSize(){ + return region.getWidth()*2; + } + } @Component diff --git a/core/src/mindustry/entities/type/base/BaseDrone.java b/core/src/mindustry/entities/type/base/BaseDrone.java index 9eaa586cca..87b140b7a9 100644 --- a/core/src/mindustry/entities/type/base/BaseDrone.java +++ b/core/src/mindustry/entities/type/base/BaseDrone.java @@ -9,7 +9,7 @@ import mindustry.world.meta.BlockFlag; import static mindustry.Vars.*; public abstract class BaseDrone extends FlyingUnit{ - public final UnitState retreat = new UnitState(){ + public final StateMachine.UnitState retreat = new StateMachine.UnitState(){ public void entered(){ target = null; } @@ -63,6 +63,6 @@ public abstract class BaseDrone extends FlyingUnit{ } @Override - public abstract UnitState getStartState(); + public abstract StateMachine.UnitState getStartState(); } diff --git a/core/src/mindustry/entities/type/base/BuilderDrone.java b/core/src/mindustry/entities/type/base/BuilderDrone.java index 0a53fb1174..f1da6f3bff 100644 --- a/core/src/mindustry/entities/type/base/BuilderDrone.java +++ b/core/src/mindustry/entities/type/base/BuilderDrone.java @@ -27,9 +27,9 @@ public class BuilderDrone extends BaseDrone implements BuilderTrait{ protected boolean isBreaking; protected Player playerTarget; - public final UnitState + public final StateMachine.UnitState - build = new UnitState(){ + build = new StateMachine.UnitState(){ public void entered(){ if(!(target instanceof BuildEntity)){ @@ -206,7 +206,7 @@ public class BuilderDrone extends BaseDrone implements BuilderTrait{ } @Override - public UnitState getStartState(){ + public StateMachine.UnitState getStartState(){ return build; } diff --git a/core/src/mindustry/entities/type/base/FlyingUnit.java b/core/src/mindustry/entities/type/base/FlyingUnit.java index 35473b7a4e..098966f02f 100644 --- a/core/src/mindustry/entities/type/base/FlyingUnit.java +++ b/core/src/mindustry/entities/type/base/FlyingUnit.java @@ -8,7 +8,6 @@ import arc.util.*; import mindustry.*; import mindustry.entities.*; import mindustry.entities.bullet.*; -import mindustry.entities.type.*; import mindustry.entities.units.*; import mindustry.graphics.*; import mindustry.world.*; @@ -19,9 +18,9 @@ import static mindustry.Vars.*; public class FlyingUnit extends BaseUnit{ protected float[] weaponAngles = {0,0}; - protected final UnitState + protected final StateMachine.UnitState - attack = new UnitState(){ + attack = new StateMachine.UnitState(){ public void entered(){ target = null; } @@ -75,7 +74,7 @@ public class FlyingUnit extends BaseUnit{ } } }, - rally = new UnitState(){ + rally = new StateMachine.UnitState(){ public void update(){ if(retarget()){ targetClosestAllyFlag(BlockFlag.rally); @@ -94,7 +93,7 @@ public class FlyingUnit extends BaseUnit{ } } }, - retreat = new UnitState(){ + retreat = new StateMachine.UnitState(){ public void entered(){ target = null; } @@ -183,7 +182,7 @@ public class FlyingUnit extends BaseUnit{ } @Override - public UnitState getStartState(){ + public StateMachine.UnitState getStartState(){ return attack; } diff --git a/core/src/mindustry/entities/type/base/GroundUnit.java b/core/src/mindustry/entities/type/base/GroundUnit.java index d1529d73de..247a5d941e 100644 --- a/core/src/mindustry/entities/type/base/GroundUnit.java +++ b/core/src/mindustry/entities/type/base/GroundUnit.java @@ -9,7 +9,6 @@ import mindustry.*; import mindustry.ai.Pathfinder.*; import mindustry.entities.*; import mindustry.entities.bullet.*; -import mindustry.entities.type.*; import mindustry.entities.units.*; import mindustry.game.*; import mindustry.world.*; @@ -25,9 +24,9 @@ public class GroundUnit extends BaseUnit{ protected float stuckTime; protected float baseRotation; - public final UnitState + public final StateMachine.UnitState - attack = new UnitState(){ + attack = new StateMachine.UnitState(){ public void entered(){ target = null; } @@ -53,7 +52,7 @@ public class GroundUnit extends BaseUnit{ } } }, - rally = new UnitState(){ + rally = new StateMachine.UnitState(){ public void update(){ Tile target = getClosest(BlockFlag.rally); @@ -62,7 +61,7 @@ public class GroundUnit extends BaseUnit{ } } }, - retreat = new UnitState(){ + retreat = new StateMachine.UnitState(){ public void entered(){ target = null; } @@ -99,7 +98,7 @@ public class GroundUnit extends BaseUnit{ } @Override - public UnitState getStartState(){ + public StateMachine.UnitState getStartState(){ return attack; } diff --git a/core/src/mindustry/entities/type/base/MinerDrone.java b/core/src/mindustry/entities/type/base/MinerDrone.java index 6a79af4bef..033bacff5f 100644 --- a/core/src/mindustry/entities/type/base/MinerDrone.java +++ b/core/src/mindustry/entities/type/base/MinerDrone.java @@ -4,7 +4,7 @@ import arc.math.Mathf; import arc.util.Structs; import mindustry.content.Blocks; import mindustry.gen.*; -import mindustry.entities.units.UnitState; +import mindustry.entities.units.StateMachine.UnitState; import mindustry.gen.Call; import mindustry.type.Item; import mindustry.type.ItemType; diff --git a/core/src/mindustry/entities/type/base/RepairDrone.java b/core/src/mindustry/entities/type/base/RepairDrone.java index 29e3ffb398..5f8861bbdb 100644 --- a/core/src/mindustry/entities/type/base/RepairDrone.java +++ b/core/src/mindustry/entities/type/base/RepairDrone.java @@ -2,7 +2,7 @@ package mindustry.entities.type.base; import mindustry.entities.Units; import mindustry.gen.*; -import mindustry.entities.units.UnitState; +import mindustry.entities.units.StateMachine.UnitState; import mindustry.world.Pos; import mindustry.world.Tile; import mindustry.world.blocks.*; diff --git a/core/src/mindustry/entities/units/AIController.java b/core/src/mindustry/entities/units/AIController.java new file mode 100644 index 0000000000..097fbd4dcd --- /dev/null +++ b/core/src/mindustry/entities/units/AIController.java @@ -0,0 +1,4 @@ +package mindustry.entities.units; + +public class AIController extends UnitController{ +} diff --git a/core/src/mindustry/entities/units/StateMachine.java b/core/src/mindustry/entities/units/StateMachine.java index 18255cec1b..9181df106e 100644 --- a/core/src/mindustry/entities/units/StateMachine.java +++ b/core/src/mindustry/entities/units/StateMachine.java @@ -21,4 +21,15 @@ public class StateMachine{ public boolean is(UnitState state){ return this.state == state; } + + public interface UnitState{ + default void entered(){ + } + + default void exited(){ + } + + default void update(){ + } + } } diff --git a/core/src/mindustry/entities/units/Statuses.java b/core/src/mindustry/entities/units/Statuses.java deleted file mode 100644 index 2af3575184..0000000000 --- a/core/src/mindustry/entities/units/Statuses.java +++ /dev/null @@ -1,149 +0,0 @@ -package mindustry.entities.units; - -import arc.struct.Bits; -import arc.struct.*; -import arc.graphics.*; -import arc.util.*; -import arc.util.pooling.*; -import mindustry.content.*; -import mindustry.ctype.ContentType; -import mindustry.entities.*; -import mindustry.type.*; - -import java.io.*; - -import static mindustry.Vars.content; - -/** Class for controlling status effects on an entity. */ -public class Statuses implements Saveable{ - private static final StatusEntry globalResult = new StatusEntry(); - private static final Array removals = new Array<>(); - - private Array statuses = new Array<>(); - private Bits applied = new Bits(content.getBy(ContentType.status).size); - - private float speedMultiplier; - private float damageMultiplier; - private float armorMultiplier; - - public void handleApply(Unitc unit, StatusEffect effect, float duration){ - if(effect == StatusEffects.none || effect == null || unit.isImmune(effect)) return; //don't apply empty or immune effects - - if(statuses.size > 0){ - //check for opposite effects - for(StatusEntry entry : statuses){ - //extend effect - if(entry.effect == effect){ - entry.time = Math.max(entry.time, duration); - return; - }else if(entry.effect.reactsWith(effect)){ //find opposite - globalResult.effect = entry.effect; - entry.effect.getTransition(unit, effect, entry.time, duration, globalResult); - entry.time = globalResult.time; - - if(globalResult.effect != entry.effect){ - entry.effect = globalResult.effect; - } - - //stop looking when one is found - return; - } - } - } - - //otherwise, no opposites found, add direct effect - StatusEntry entry = Pools.obtain(StatusEntry.class, StatusEntry::new); - entry.set(effect, duration); - statuses.add(entry); - } - - public Color getStatusColor(){ - if(statuses.size == 0){ - return Tmp.c1.set(Color.white); - } - - float r = 0f, g = 0f, b = 0f; - for(StatusEntry entry : statuses){ - r += entry.effect.color.r; - g += entry.effect.color.g; - b += entry.effect.color.b; - } - return Tmp.c1.set(r / statuses.size, g / statuses.size, b / statuses.size, 1f); - } - - public void clear(){ - statuses.clear(); - } - - public void update(Unitc unit){ - applied.clear(); - speedMultiplier = damageMultiplier = armorMultiplier = 1f; - - if(statuses.size == 0) return; - - removals.clear(); - - for(StatusEntry entry : statuses){ - entry.time = Math.max(entry.time - Time.delta(), 0); - applied.set(entry.effect.id); - - if(entry.time <= 0){ - Pools.free(entry); - removals.add(entry); - }else{ - speedMultiplier *= entry.effect.speedMultiplier; - armorMultiplier *= entry.effect.armorMultiplier; - damageMultiplier *= entry.effect.damageMultiplier; - entry.effect.update(unit, entry.time); - } - } - - if(removals.size > 0){ - statuses.removeAll(removals, true); - } - } - - public float getSpeedMultiplier(){ - return speedMultiplier; - } - - public float getDamageMultiplier(){ - return damageMultiplier; - } - - public float getArmorMultiplier(){ - return armorMultiplier; - } - - public boolean hasEffect(StatusEffect effect){ - return applied.get(effect.id); - } - - @Override - public void writeSave(DataOutput stream) throws IOException{ - stream.writeByte(statuses.size); - for(StatusEntry entry : statuses){ - stream.writeByte(entry.effect.id); - stream.writeFloat(entry.time); - } - } - - @Override - public void readSave(DataInput stream, byte version) throws IOException{ - for(StatusEntry effect : statuses){ - Pools.free(effect); - } - - statuses.clear(); - - byte amount = stream.readByte(); - for(int i = 0; i < amount; i++){ - byte id = stream.readByte(); - float time = stream.readFloat(); - StatusEntry entry = Pools.obtain(StatusEntry.class, StatusEntry::new); - entry.set(content.getByID(ContentType.status, id), time); - statuses.add(entry); - } - } - -} diff --git a/core/src/mindustry/entities/units/UnitController.java b/core/src/mindustry/entities/units/UnitController.java index c41aca463f..de87597c82 100644 --- a/core/src/mindustry/entities/units/UnitController.java +++ b/core/src/mindustry/entities/units/UnitController.java @@ -1,5 +1,12 @@ package mindustry.entities.units; +import mindustry.gen.*; + //TODO rename -public class UnitController{ +public abstract class UnitController{ + protected Unitc unit; + + public void set(Unitc unit){ + this.unit = unit; + } } diff --git a/core/src/mindustry/entities/units/UnitDrops.java b/core/src/mindustry/entities/units/UnitDrops.java deleted file mode 100644 index 0097c359e9..0000000000 --- a/core/src/mindustry/entities/units/UnitDrops.java +++ /dev/null @@ -1,47 +0,0 @@ -package mindustry.entities.units; - -import arc.math.Mathf; -import mindustry.Vars; -import mindustry.content.Items; -import mindustry.gen.*; -import mindustry.gen.Call; -import mindustry.type.Item; -import static mindustry.Vars.*; - -public class UnitDrops{ - private static Item[] dropTable; - - public static void dropItems(BaseUnit unit){ - //items only dropped in waves for enemy team - if(unit.getTeam() != state.rules.waveTeam || !Vars.state.rules.unitDrops){ - return; - } - - Tilec core = unit.getClosestEnemyCore(); - - if(core == null || core.dst(unit) > Vars.mineTransferRange){ - return; - } - - if(dropTable == null){ - dropTable = new Item[]{Items.titanium, Items.silicon, Items.lead, Items.copper}; - } - - for(int i = 0; i < 3; i++){ - for(Item item : dropTable){ - //only drop unlocked items - if(!Vars.headless && !Vars.data.isUnlocked(item)){ - continue; - } - - if(Mathf.chance(0.03)){ - int amount = Mathf.random(20, 40); - amount = core.tile.block().acceptStack(item, amount, core.tile, null); - if(amount > 0){ - Call.transferItemTo(item, amount, unit.x + Mathf.range(2f), unit.y + Mathf.range(2f), core.tile); - } - } - } - } - } -} diff --git a/core/src/mindustry/entities/units/UnitState.java b/core/src/mindustry/entities/units/UnitState.java deleted file mode 100644 index d64dd49446..0000000000 --- a/core/src/mindustry/entities/units/UnitState.java +++ /dev/null @@ -1,12 +0,0 @@ -package mindustry.entities.units; - -public interface UnitState{ - default void entered(){ - } - - default void exited(){ - } - - default void update(){ - } -}