diff --git a/core/src/mindustry/input/DesktopInput.java b/core/src/mindustry/input/DesktopInput.java index 40708b4586..7d21274419 100644 --- a/core/src/mindustry/input/DesktopInput.java +++ b/core/src/mindustry/input/DesktopInput.java @@ -13,7 +13,6 @@ import arc.scene.ui.layout.*; import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.*; -import mindustry.content.*; import mindustry.entities.*; import mindustry.entities.units.*; import mindustry.game.EventType.*; @@ -22,10 +21,9 @@ import mindustry.gen.*; import mindustry.graphics.*; import mindustry.ui.*; import mindustry.world.*; -import mindustry.world.blocks.payloads.*; -import mindustry.world.meta.*; -import static arc.Core.scene; +import static arc.Core.*; +import static mindustry.Vars.net; import static mindustry.Vars.*; import static mindustry.input.PlaceMode.*; @@ -601,33 +599,24 @@ public class DesktopInput extends InputHandler{ player.mouseX = unit.aimX(); player.mouseY = unit.aimY(); - //TODO netsync this if(unit instanceof Payloadc){ Payloadc pay = (Payloadc)unit; if(Core.input.keyTap(Binding.pickupCargo) && pay.payloads().size < unit.type().payloadCapacity){ - Unit target = Units.closest(player.team(), pay.x(), pay.y(), 30f, u -> u.isAI() && u.isGrounded()); + Unit target = Units.closest(player.team(), pay.x(), pay.y(), unit.type().hitsize * 1.1f, u -> u.isAI() && u.isGrounded()); if(target != null){ - pay.pickup(target); + Call.pickupUnitPayload(player, target); }else if(!pay.hasPayload()){ Building tile = world.entWorld(pay.x(), pay.y()); - if(tile != null && tile.team() == unit.team && tile.block().synthetic()){ - //pick up block directly - if(tile.block().buildVisibility != BuildVisibility.hidden && tile.block().size <= 2){ - pay.pickup(tile); - }else{ //pick up block payload - Payload taken = tile.takePayload(); - if(taken != null){ - pay.addPayload(taken); - Fx.unitPickup.at(tile); - } - } + if(tile != null && tile.team() == unit.team){ + Call.pickupBlockPayload(player, tile); } } } if(Core.input.keyTap(Binding.dropCargo)){ + Call.dropPayload(player, player.x, player.y); pay.dropLastPayload(); } } diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index 9538d3df3c..5237a2c117 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -33,8 +33,10 @@ import mindustry.ui.fragments.*; import mindustry.world.*; import mindustry.world.blocks.*; import mindustry.world.blocks.BuildBlock.*; +import mindustry.world.blocks.payloads.*; import mindustry.world.blocks.power.*; import mindustry.world.blocks.storage.CoreBlock.*; +import mindustry.world.meta.*; import java.util.*; @@ -104,6 +106,50 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ player.builder().removeBuild(x, y, breaking); } + @Remote(targets = Loc.both, called = Loc.server, forward = true) + public static void pickupUnitPayload(Player player, Unit target){ + Unit unit = player.unit(); + Payloadc pay = (Payloadc)unit; + + if(target.isAI() && target.isGrounded() && pay.payloads().size < unit.type().payloadCapacity + && target.within(unit, unit.type().hitsize * 1.5f)){ + pay.pickup(target); + } + } + + @Remote(targets = Loc.both, called = Loc.server, forward = true) + public static void pickupBlockPayload(Player player, Building tile){ + Unit unit = player.unit(); + Payloadc pay = (Payloadc)unit; + + if(tile != null && tile.team() == unit.team && pay.payloads().size < unit.type().payloadCapacity + && unit.within(tile, tilesize * tile.block.size * 1.2f)){ + //pick up block directly + if(tile.block().buildVisibility != BuildVisibility.hidden && tile.block().size <= 2){ + pay.pickup(tile); + }else{ //pick up block payload + Payload taken = tile.takePayload(); + if(taken != null){ + pay.addPayload(taken); + Fx.unitPickup.at(tile); + } + } + } + } + + @Remote(targets = Loc.both, called = Loc.server, forward = true) + public static void dropPayload(Player player, float x, float y){ + Payloadc pay = (Payloadc)player.unit(); + + //allow a slight margin of error + if(pay.within(x, y, tilesize * 2f)){ + float prevx = pay.x(), prevy = pay.y(); + pay.set(x, y); + pay.dropLastPayload(); + pay.set(prevx, prevy); + } + } + @Remote(targets = Loc.client, called = Loc.server) public static void dropItem(Player player, float angle){ if(net.server() && player.unit().stack.amount <= 0){ diff --git a/core/src/mindustry/world/blocks/distribution/MassDriver.java b/core/src/mindustry/world/blocks/distribution/MassDriver.java index 9575ae195e..af243a54e9 100644 --- a/core/src/mindustry/world/blocks/distribution/MassDriver.java +++ b/core/src/mindustry/world/blocks/distribution/MassDriver.java @@ -103,7 +103,7 @@ public class MassDriver extends Block{ //reload regardless of state if(reload > 0f){ - reload = Mathf.clamp(reload - delta() / reloadTime * efficiency()); + reload = Mathf.clamp(reload - edelta() / reloadTime); } //cleanup waiting shooters that are not valid