Payload system rework (#2485)
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(){
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user