Payload system rework (#2485)

This commit is contained in:
Anuken
2020-09-06 17:13:14 -04:00
parent 27d9f965be
commit 7b18389d45
7 changed files with 38 additions and 27 deletions
+1 -1
View File
@@ -1035,7 +1035,7 @@ public class UnitTypes implements ContentList{
rotateShooting = false; rotateShooting = false;
hitsize = 15f; hitsize = 15f;
engineSize = 3f; engineSize = 3f;
payloadCapacity = 4; payloadCapacity = 4 * 8;
weapons.add( weapons.add(
new Weapon("heal-weapon-mount"){{ new Weapon("heal-weapon-mount"){{
@@ -8,16 +8,34 @@ import mindustry.annotations.Annotations.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.entities.*; import mindustry.entities.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.type.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.blocks.payloads.*; import mindustry.world.blocks.payloads.*;
/** An entity that holds a payload. */ /** An entity that holds a payload. */
@Component @Component
abstract class PayloadComp implements Posc, Rotc, Hitboxc{ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{
@Import float x, y, rotation; @Import float x, y, rotation;
@Import UnitType type;
Seq<Payload> payloads = new Seq<>(); Seq<Payload> 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(){ boolean hasPayload(){
return payloads.size > 0; return payloads.size > 0;
} }
+7 -12
View File
@@ -112,8 +112,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
Unit unit = player.unit(); Unit unit = player.unit();
Payloadc pay = (Payloadc)unit; Payloadc pay = (Payloadc)unit;
if(target.isAI() && target.isGrounded() && pay.payloads().size < unit.type().payloadCapacity if(target.isAI() && target.isGrounded() && pay.canPickup(target)
&& target.mass() < unit.mass()
&& target.within(unit, unit.type().hitsize * 1.5f + target.type().hitsize)){ && target.within(unit, unit.type().hitsize * 1.5f + target.type().hitsize)){
pay.pickup(target); pay.pickup(target);
} }
@@ -126,14 +125,14 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
Unit unit = player.unit(); Unit unit = player.unit();
Payloadc pay = (Payloadc)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)){ && unit.within(tile, tilesize * tile.block.size * 1.2f)){
//pick up block directly //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); pay.pickup(tile);
}else{ //pick up block payload }else{ //pick up block payload
Payload current = tile.getPayload(); Payload current = tile.getPayload();
if(current != null && current.canBeTaken(pay)){ if(current != null && pay.canPickupPayload(current)){
Payload taken = tile.takePayload(); Payload taken = tile.takePayload();
if(taken != null){ if(taken != null){
pay.addPayload(taken); pay.addPayload(taken);
@@ -339,15 +338,13 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
if(!(unit instanceof Payloadc)) return; if(!(unit instanceof Payloadc)) return;
Payloadc pay = (Payloadc)unit; 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() && pay.canPickup(u) && 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() && u.mass() < unit.mass() && u.within(unit, u.hitSize + unit.hitSize * 1.2f));
if(target != null){ if(target != null){
Call.pickupUnitPayload(player, target); Call.pickupUnitPayload(player, target);
}else if(!pay.hasPayload()){ }else{
Building tile = world.buildWorld(pay.x(), pay.y()); 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); Call.pickupBlockPayload(player, tile);
} }
} }
@@ -356,10 +353,8 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
public void tryDropPayload(){ public void tryDropPayload(){
Unit unit = player.unit(); Unit unit = player.unit();
if(!(unit instanceof Payloadc)) return; if(!(unit instanceof Payloadc)) return;
Payloadc pay = (Payloadc)unit;
Call.dropPayload(player, player.x, player.y); Call.dropPayload(player, player.x, player.y);
pay.dropLastPayload();
} }
public float getMouseX(){ public float getMouseX(){
+1 -1
View File
@@ -49,7 +49,7 @@ public class UnitType extends UnlockableContent{
public boolean destructibleWreck = true; public boolean destructibleWreck = true;
public float groundLayer = Layer.groundUnit; public float groundLayer = Layer.groundUnit;
public float sway = 1f; public float sway = 1f;
public float payloadCapacity = 1; public float payloadCapacity = 8;
public int commandLimit = 24; public int commandLimit = 24;
public float visualElevation = -1f; public float visualElevation = -1f;
public boolean allowLegStep = false; public boolean allowLegStep = false;
@@ -35,8 +35,8 @@ public class BlockPayload implements Payload{
} }
@Override @Override
public boolean canBeTaken(Payloadc picker){ public float size(){
return entity.block.size <= 2; return entity.block.size * tilesize;
} }
@Override @Override
@@ -17,6 +17,9 @@ public interface Payload{
/** draws this payload at a position. */ /** draws this payload at a position. */
void draw(); void draw();
/** @return hitbox size of the payload. */
float size();
/** @return whether this payload was dumped. */ /** @return whether this payload was dumped. */
default boolean dump(){ default boolean dump(){
return false; return false;
@@ -27,11 +30,6 @@ public interface Payload{
return true; return true;
} }
/** @return whether the unit can pick up this payload. */
default boolean canBeTaken(Payloadc picker){
return true;
}
/** writes the payload for saving. */ /** writes the payload for saving. */
void write(Writes write); void write(Writes write);
@@ -20,11 +20,6 @@ public class UnitPayload implements Payload{
return unit.hitSize <= 16f; return unit.hitSize <= 16f;
} }
@Override
public boolean canBeTaken(Payloadc picker){
return unit.hitSize < picker.hitSize();
}
@Override @Override
public void write(Writes write){ public void write(Writes write){
write.b(payloadUnit); write.b(payloadUnit);
@@ -38,6 +33,11 @@ public class UnitPayload implements Payload{
unit.rotation(rotation); unit.rotation(rotation);
} }
@Override
public float size(){
return unit.hitSize;
}
@Override @Override
public boolean dump(){ public boolean dump(){
//no client dumping //no client dumping