From 053afcace953d7123cf5cb558afb597bc90e5942 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 23 Jul 2023 15:43:04 -0400 Subject: [PATCH] Fixed #8795 --- core/src/mindustry/input/InputHandler.java | 20 +++++++++++++++++--- core/src/mindustry/net/Administration.java | 6 +++++- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index 8ce8ea7dd1..5aa88afbab 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -364,13 +364,19 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ @Remote(targets = Loc.both, called = Loc.server) public static void requestBuildPayload(Player player, Building build){ - if(player == null || !(player.unit() instanceof Payloadc pay)) return; + if(player == null || !(player.unit() instanceof Payloadc pay) || build == null) return; Unit unit = player.unit(); - if(build != null && state.teams.canInteract(unit.team, build.team) - && unit.within(build, tilesize * build.block.size * 1.2f + tilesize * 5f)){ + if(!unit.within(build, tilesize * build.block.size * 1.2f + tilesize * 5f)) return; + if(net.server() && !netServer.admins.allowAction(player, ActionType.pickupBlock, build.tile, action -> { + action.unit = unit; + })){ + throw new ValidateException(player, "Player cannot pick up a block."); + } + + if(state.teams.canInteract(unit.team, build.team)){ //pick up block's payload Payload current = build.getPayload(); if(current != null && pay.canPickupPayload(current)){ @@ -424,6 +430,14 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Payloadc pay = (Payloadc)player.unit(); + if(pay.payloads().isEmpty()) return; + + if(net.server() && !netServer.admins.allowAction(player, ActionType.dropPayload, player.unit().tileOn(), action -> { + action.payload = pay.payloads().peek(); + })){ + throw new ValidateException(player, "Player cannot drop a payload."); + } + //apply margin of error Tmp.v1.set(x, y).sub(pay).limit(tilesize * 4f).add(pay); float cx = Tmp.v1.x, cy = Tmp.v1.y; diff --git a/core/src/mindustry/net/Administration.java b/core/src/mindustry/net/Administration.java index 4d68060fe4..9f4d14846b 100644 --- a/core/src/mindustry/net/Administration.java +++ b/core/src/mindustry/net/Administration.java @@ -11,6 +11,7 @@ import mindustry.*; import mindustry.gen.*; import mindustry.type.*; import mindustry.world.*; +import mindustry.world.blocks.payloads.*; import static mindustry.Vars.*; import static mindustry.game.EventType.*; @@ -659,6 +660,9 @@ public class Administration{ /** valid for unit-type events only, and even in that case may be null. */ public @Nullable Unit unit; + /** valid only for payload events */ + public @Nullable Payload payload; + /** valid only for removePlanned events only; contains packed positions. */ public @Nullable int[] plans; @@ -697,7 +701,7 @@ public class Administration{ } public enum ActionType{ - breakBlock, placeBlock, rotate, configure, withdrawItem, depositItem, control, buildSelect, command, removePlanned, commandUnits, commandBuilding, respawn + breakBlock, placeBlock, rotate, configure, withdrawItem, depositItem, control, buildSelect, command, removePlanned, commandUnits, commandBuilding, respawn, pickupBlock, dropPayload } }