From 7b18389d45dd0b7b9ba6931efd56143b8042cad8 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 6 Sep 2020 17:13:14 -0400 Subject: [PATCH] Payload system rework (#2485) --- core/src/mindustry/content/UnitTypes.java | 2 +- .../mindustry/entities/comp/PayloadComp.java | 20 ++++++++++++++++++- core/src/mindustry/input/InputHandler.java | 19 +++++++----------- core/src/mindustry/type/UnitType.java | 2 +- .../world/blocks/payloads/BlockPayload.java | 4 ++-- .../world/blocks/payloads/Payload.java | 8 +++----- .../world/blocks/payloads/UnitPayload.java | 10 +++++----- 7 files changed, 38 insertions(+), 27 deletions(-) diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index a98061b873..fb7d29acfb 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -1035,7 +1035,7 @@ public class UnitTypes implements ContentList{ rotateShooting = false; hitsize = 15f; engineSize = 3f; - payloadCapacity = 4; + payloadCapacity = 4 * 8; weapons.add( new Weapon("heal-weapon-mount"){{ diff --git a/core/src/mindustry/entities/comp/PayloadComp.java b/core/src/mindustry/entities/comp/PayloadComp.java index 6a75086eec..46e1b694e9 100644 --- a/core/src/mindustry/entities/comp/PayloadComp.java +++ b/core/src/mindustry/entities/comp/PayloadComp.java @@ -8,16 +8,34 @@ import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.entities.*; import mindustry.gen.*; +import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.payloads.*; /** An entity that holds a payload. */ @Component -abstract class PayloadComp implements Posc, Rotc, Hitboxc{ +abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{ @Import float x, y, rotation; + @Import UnitType type; Seq payloads = new Seq<>(); + float payloadUsed(){ + return payloads.sumf(Payload::size); + } + + boolean canPickup(Unit unit){ + return payloadUsed() + unit.hitSize <= type.payloadCapacity; + } + + boolean canPickup(Building build){ + return payloadUsed() + build.block.size * Vars.tilesize <= type.payloadCapacity; + } + + boolean canPickupPayload(Payload pay){ + return payloadUsed() + pay.size() <= type.payloadCapacity; + } + boolean hasPayload(){ return payloads.size > 0; } diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index 07c937db68..c40dba517e 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -112,8 +112,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Unit unit = player.unit(); Payloadc pay = (Payloadc)unit; - if(target.isAI() && target.isGrounded() && pay.payloads().size < unit.type().payloadCapacity - && target.mass() < unit.mass() + if(target.isAI() && target.isGrounded() && pay.canPickup(target) && target.within(unit, unit.type().hitsize * 1.5f + target.type().hitsize)){ pay.pickup(target); } @@ -126,14 +125,14 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Unit unit = player.unit(); Payloadc pay = (Payloadc)unit; - if(tile != null && tile.team == unit.team && pay.payloads().size < unit.type().payloadCapacity + if(tile != null && tile.team == unit.team && pay.canPickup(tile) && unit.within(tile, tilesize * tile.block.size * 1.2f)){ //pick up block directly - if(tile.block().buildVisibility != BuildVisibility.hidden && tile.block().size <= 2 && tile.canPickup()){ + if(tile.block().buildVisibility != BuildVisibility.hidden && tile.canPickup()){ pay.pickup(tile); }else{ //pick up block payload Payload current = tile.getPayload(); - if(current != null && current.canBeTaken(pay)){ + if(current != null && pay.canPickupPayload(current)){ Payload taken = tile.takePayload(); if(taken != null){ pay.addPayload(taken); @@ -339,15 +338,13 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ if(!(unit instanceof Payloadc)) return; Payloadc pay = (Payloadc)unit; - if(pay.payloads().size >= unit.type().payloadCapacity) return; - - Unit target = Units.closest(player.team(), pay.x(), pay.y(), unit.type().hitsize * 2.5f, u -> u.isAI() && u.isGrounded() && u.mass() < unit.mass() && u.within(unit, u.hitSize + unit.hitSize * 1.2f)); + Unit target = Units.closest(player.team(), pay.x(), pay.y(), unit.type().hitsize * 2.5f, u -> u.isAI() && u.isGrounded() && pay.canPickup(u) && u.within(unit, u.hitSize + unit.hitSize * 1.2f)); if(target != null){ Call.pickupUnitPayload(player, target); - }else if(!pay.hasPayload()){ + }else{ Building tile = world.buildWorld(pay.x(), pay.y()); - if(tile != null && tile.team == unit.team){ + if(tile != null && tile.team == unit.team && pay.canPickup(tile)){ Call.pickupBlockPayload(player, tile); } } @@ -356,10 +353,8 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ public void tryDropPayload(){ Unit unit = player.unit(); if(!(unit instanceof Payloadc)) return; - Payloadc pay = (Payloadc)unit; Call.dropPayload(player, player.x, player.y); - pay.dropLastPayload(); } public float getMouseX(){ diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index 7a7524f8c3..80357dfab2 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -49,7 +49,7 @@ public class UnitType extends UnlockableContent{ public boolean destructibleWreck = true; public float groundLayer = Layer.groundUnit; public float sway = 1f; - public float payloadCapacity = 1; + public float payloadCapacity = 8; public int commandLimit = 24; public float visualElevation = -1f; public boolean allowLegStep = false; diff --git a/core/src/mindustry/world/blocks/payloads/BlockPayload.java b/core/src/mindustry/world/blocks/payloads/BlockPayload.java index 5690cd46d0..ec956453c0 100644 --- a/core/src/mindustry/world/blocks/payloads/BlockPayload.java +++ b/core/src/mindustry/world/blocks/payloads/BlockPayload.java @@ -35,8 +35,8 @@ public class BlockPayload implements Payload{ } @Override - public boolean canBeTaken(Payloadc picker){ - return entity.block.size <= 2; + public float size(){ + return entity.block.size * tilesize; } @Override diff --git a/core/src/mindustry/world/blocks/payloads/Payload.java b/core/src/mindustry/world/blocks/payloads/Payload.java index 3a136474b3..60d0f07c7c 100644 --- a/core/src/mindustry/world/blocks/payloads/Payload.java +++ b/core/src/mindustry/world/blocks/payloads/Payload.java @@ -17,6 +17,9 @@ public interface Payload{ /** draws this payload at a position. */ void draw(); + /** @return hitbox size of the payload. */ + float size(); + /** @return whether this payload was dumped. */ default boolean dump(){ return false; @@ -27,11 +30,6 @@ public interface Payload{ return true; } - /** @return whether the unit can pick up this payload. */ - default boolean canBeTaken(Payloadc picker){ - return true; - } - /** writes the payload for saving. */ void write(Writes write); diff --git a/core/src/mindustry/world/blocks/payloads/UnitPayload.java b/core/src/mindustry/world/blocks/payloads/UnitPayload.java index ee912480de..4394b349d6 100644 --- a/core/src/mindustry/world/blocks/payloads/UnitPayload.java +++ b/core/src/mindustry/world/blocks/payloads/UnitPayload.java @@ -20,11 +20,6 @@ public class UnitPayload implements Payload{ return unit.hitSize <= 16f; } - @Override - public boolean canBeTaken(Payloadc picker){ - return unit.hitSize < picker.hitSize(); - } - @Override public void write(Writes write){ write.b(payloadUnit); @@ -38,6 +33,11 @@ public class UnitPayload implements Payload{ unit.rotation(rotation); } + @Override + public float size(){ + return unit.hitSize; + } + @Override public boolean dump(){ //no client dumping