From 0e53d703b3eff1f75275fc747753aae10d7ae305 Mon Sep 17 00:00:00 2001 From: Alejandro <25-alejandro@users.noreply.git.krews.org> Date: Thu, 6 Feb 2020 00:56:40 +0200 Subject: [PATCH 1/4] Fix vending machine behaviour --- .../InteractionEffectVendingMachine.java | 58 +---------- .../InteractionVendingMachine.java | 99 ++++++++++++++++--- .../eu/habbo/habbohotel/rooms/RoomUnit.java | 10 ++ .../rooms/users/RoomUserWalkEvent.java | 3 + .../runnables/RoomUnitWalkToLocation.java | 12 +-- 5 files changed, 108 insertions(+), 74 deletions(-) diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionEffectVendingMachine.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionEffectVendingMachine.java index 06897ec4..eccba568 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionEffectVendingMachine.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionEffectVendingMachine.java @@ -4,6 +4,7 @@ import com.eu.habbo.Emulator; import com.eu.habbo.habbohotel.gameclients.GameClient; import com.eu.habbo.habbohotel.items.Item; import com.eu.habbo.habbohotel.rooms.*; +import com.eu.habbo.habbohotel.users.Habbo; import com.eu.habbo.habbohotel.users.HabboItem; import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; @@ -16,7 +17,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -public class InteractionEffectVendingMachine extends InteractionDefault { +public class InteractionEffectVendingMachine extends InteractionVendingMachine { public InteractionEffectVendingMachine(ResultSet set, Item baseItem) throws SQLException { super(set, baseItem); this.setExtradata("0"); @@ -28,58 +29,7 @@ public class InteractionEffectVendingMachine extends InteractionDefault { } @Override - public void onClick(GameClient client, Room room, Object[] objects) throws Exception { - super.onClick(client, room, objects); - - if (client != null) { - RoomTile tile = getSquareInFront(room.getLayout(), this); - - if (tile != null) { - if (tile.equals(client.getHabbo().getRoomUnit().getCurrentLocation())) { - if (this.getExtradata().equals("0") || this.getExtradata().length() == 0) { - room.updateHabbo(client.getHabbo()); - if (!client.getHabbo().getRoomUnit().hasStatus(RoomUnitStatus.SIT)) { - client.getHabbo().getRoomUnit().setRotation(RoomUserRotation.values()[Rotation.Calculate(client.getHabbo().getRoomUnit().getX(), client.getHabbo().getRoomUnit().getY(), this.getX(), this.getY())]); - client.getHabbo().getRoomUnit().removeStatus(RoomUnitStatus.MOVE); - room.scheduledComposers.add(new RoomUserStatusComposer(client.getHabbo().getRoomUnit()).compose()); - } - this.setExtradata("1"); - room.scheduledComposers.add(new FloorItemUpdateComposer(this).compose()); - Emulator.getThreading().run(this, 1000); - HabboItem instance = this; - Emulator.getThreading().run(new Runnable() { - @Override - public void run() { - room.giveEffect(client.getHabbo().getRoomUnit(), instance.getBaseItem().getRandomVendingItem(), 30); - } - }); - } - } else { - if (!tile.isWalkable() && tile.state != RoomTileState.SIT && tile.state != RoomTileState.LAY) { - for (RoomTile t : room.getLayout().getTilesAround(room.getLayout().getTile(this.getX(), this.getY()))) { - if (t != null && t.isWalkable()) { - tile = t; - break; - } - } - } - - List onSuccess = new ArrayList<>(); - List onFail = new ArrayList<>(); - - onSuccess.add(() -> Emulator.getThreading().run(() -> { - try { - this.onClick(client, room, objects); - } catch (Exception e) { - e.printStackTrace(); - } - }, 500)); - - client.getHabbo().getRoomUnit().setGoalLocation(tile); - Emulator.getThreading().run(new RoomUnitWalkToLocation(client.getHabbo().getRoomUnit(), tile, room, onSuccess, onFail)); - } - } - } + public void giveVendingMachineItem(Habbo habbo, Room room) { + room.giveEffect(habbo.getRoomUnit(), this.getBaseItem().getRandomVendingItem(), 30); } - } \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionVendingMachine.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionVendingMachine.java index 266bba73..50d66b91 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionVendingMachine.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionVendingMachine.java @@ -4,13 +4,13 @@ import com.eu.habbo.Emulator; import com.eu.habbo.habbohotel.gameclients.GameClient; import com.eu.habbo.habbohotel.items.Item; import com.eu.habbo.habbohotel.rooms.*; +import com.eu.habbo.habbohotel.users.Habbo; import com.eu.habbo.habbohotel.users.HabboGender; import com.eu.habbo.habbohotel.users.HabboItem; import com.eu.habbo.messages.ServerMessage; import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; import com.eu.habbo.threading.runnables.RoomUnitGiveHanditem; -import com.eu.habbo.threading.runnables.RoomUnitVendingMachineAction; import com.eu.habbo.threading.runnables.RoomUnitWalkToLocation; import com.eu.habbo.util.pathfinding.Rotation; @@ -18,6 +18,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ExecutionException; public class InteractionVendingMachine extends HabboItem { public InteractionVendingMachine(ResultSet set, Item baseItem) throws SQLException { @@ -52,21 +53,25 @@ public class InteractionVendingMachine extends HabboItem { if (this.getExtradata().equals("0") || this.getExtradata().length() == 0) { if (!client.getHabbo().getRoomUnit().hasStatus(RoomUnitStatus.SIT) && (!client.getHabbo().getRoomUnit().hasStatus(RoomUnitStatus.MOVE) || tile.equals(client.getHabbo().getRoomUnit().getGoal()))) { room.updateHabbo(client.getHabbo()); - client.getHabbo().getRoomUnit().setRotation(RoomUserRotation.values()[Rotation.Calculate(client.getHabbo().getRoomUnit().getX(), client.getHabbo().getRoomUnit().getY(), this.getX(), this.getY())]); + this.rotateToMachine(client.getHabbo().getRoomUnit()); client.getHabbo().getRoomUnit().removeStatus(RoomUnitStatus.MOVE); room.scheduledComposers.add(new RoomUserStatusComposer(client.getHabbo().getRoomUnit()).compose()); } - this.setExtradata("1"); - room.scheduledComposers.add(new FloorItemUpdateComposer(this).compose()); - Emulator.getThreading().run(this, 1000); - Emulator.getThreading().run(new RoomUnitGiveHanditem(client.getHabbo().getRoomUnit(), room, this.getBaseItem().getRandomVendingItem())); - - if (this.getBaseItem().getEffectM() > 0 && client.getHabbo().getHabboInfo().getGender() == HabboGender.M) - room.giveEffect(client.getHabbo(), this.getBaseItem().getEffectM(), -1); - if (this.getBaseItem().getEffectF() > 0 && client.getHabbo().getHabboInfo().getGender() == HabboGender.F) - room.giveEffect(client.getHabbo(), this.getBaseItem().getEffectF(), -1); super.onClick(client, room, new Object[]{"TOGGLE_OVERRIDE"}); + + this.setExtradata("1"); + room.scheduledComposers.add(new FloorItemUpdateComposer(this).compose()); + + Emulator.getThreading().run(() -> { + Emulator.getThreading().run(this, 1000); + this.giveVendingMachineItem(client.getHabbo(), room); + + if (this.getBaseItem().getEffectM() > 0 && client.getHabbo().getHabboInfo().getGender() == HabboGender.M) + room.giveEffect(client.getHabbo(), this.getBaseItem().getEffectM(), -1); + if (this.getBaseItem().getEffectF() > 0 && client.getHabbo().getHabboInfo().getGender() == HabboGender.F) + room.giveEffect(client.getHabbo(), this.getBaseItem().getEffectF(), -1); + }, 500); } } else { if (!tile.isWalkable() && tile.state != RoomTileState.SIT && tile.state != RoomTileState.LAY) { @@ -81,13 +86,42 @@ public class InteractionVendingMachine extends HabboItem { List onSuccess = new ArrayList<>(); List onFail = new ArrayList<>(); - onSuccess.add(() -> Emulator.getThreading().run(() -> { + RoomTile finalTile = tile; + onSuccess.add(() -> { + this.setExtradata("1"); + room.scheduledComposers.add(new FloorItemUpdateComposer(this).compose()); + try { - this.onClick(client, room, objects); + super.onClick(client, room, new Object[]{"TOGGLE_OVERRIDE"}); } catch (Exception e) { e.printStackTrace(); } - }, 500)); + + Emulator.getThreading().run(() -> { + Runnable procedure = () -> { + if (client.getHabbo().getRoomUnit().getCurrentLocation().equals(finalTile)) { + this.rotateToMachine(client.getHabbo().getRoomUnit()); + room.sendComposer(new RoomUserStatusComposer(client.getHabbo().getRoomUnit()).compose()); + } + + try { + Emulator.getThreading().run(() -> { + Emulator.getThreading().run(this, 1000); + this.giveVendingMachineItem(client.getHabbo(), room); + + if (this.getBaseItem().getEffectM() > 0 && client.getHabbo().getHabboInfo().getGender() == HabboGender.M) + room.giveEffect(client.getHabbo(), this.getBaseItem().getEffectM(), -1); + if (this.getBaseItem().getEffectF() > 0 && client.getHabbo().getHabboInfo().getGender() == HabboGender.F) + room.giveEffect(client.getHabbo(), this.getBaseItem().getEffectF(), -1); + }, 500).get(); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + }; + + client.getHabbo().getRoomUnit().setMoveBlockingTask(Emulator.getThreading().run(procedure, 300)); + }, 250); + }); client.getHabbo().getRoomUnit().setGoalLocation(tile); Emulator.getThreading().run(new RoomUnitWalkToLocation(client.getHabbo().getRoomUnit(), tile, room, onSuccess, onFail)); @@ -136,4 +170,41 @@ public class InteractionVendingMachine extends HabboItem { public boolean isUsable() { return true; } + + private void rotateToMachine(RoomUnit unit) { + RoomUserRotation rotation = RoomUserRotation.values()[Rotation.Calculate(unit.getX(), unit.getY(), this.getX(), this.getY())]; + boolean onlyHead = false; + + switch (unit.getBodyRotation()) { + case NORTH_EAST: + if (rotation.equals(RoomUserRotation.NORTH) || rotation.equals(RoomUserRotation.EAST)) + onlyHead = true; + break; + + case NORTH_WEST: + if (rotation.equals(RoomUserRotation.NORTH) || rotation.equals(RoomUserRotation.WEST)) + onlyHead = true; + break; + + case SOUTH_EAST: + if (rotation.equals(RoomUserRotation.SOUTH) || rotation.equals(RoomUserRotation.EAST)) + onlyHead = true; + break; + + case SOUTH_WEST: + if (rotation.equals(RoomUserRotation.SOUTH) || rotation.equals(RoomUserRotation.WEST)) + onlyHead = true; + break; + } + + if (onlyHead) { + unit.setHeadRotation(rotation); + } else { + unit.setRotation(rotation); + } + } + + public void giveVendingMachineItem(Habbo habbo, Room room) { + Emulator.getThreading().run(new RoomUnitGiveHanditem(habbo.getRoomUnit(), room, this.getBaseItem().getRandomVendingItem())); + } } diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnit.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnit.java index 348fddad..47489f78 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnit.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnit.java @@ -27,6 +27,7 @@ import gnu.trove.set.hash.THashSet; import java.util.*; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledFuture; public class RoomUnit { private final ConcurrentHashMap status; @@ -65,6 +66,7 @@ public class RoomUnit { private int walkTimeOut; private int effectId; private int effectEndTimestamp; + private ScheduledFuture moveBlockingTask; private int idleTimer; private Room room; @@ -768,4 +770,12 @@ public class RoomUnit { .filter(t -> t != null && t.isWalkable() && !room.hasHabbosAt(t.x, t.y)) .min(Comparator.comparingDouble(a -> a.distance(this.getCurrentLocation()))).orElse(null); } + + public ScheduledFuture getMoveBlockingTask() { + return moveBlockingTask; + } + + public void setMoveBlockingTask(ScheduledFuture moveBlockingTask) { + this.moveBlockingTask = moveBlockingTask; + } } diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserWalkEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserWalkEvent.java index 815fe3e0..920a4d77 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserWalkEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserWalkEvent.java @@ -117,6 +117,9 @@ public class RoomUserWalkEvent extends MessageHandler { // This is where we set the end location and begin finding a path if (tile.isWalkable() || room.canSitOrLayAt(tile.x, tile.y)) { + if (roomUnit.getMoveBlockingTask() != null) roomUnit.getMoveBlockingTask().get(); + System.out.println(roomUnit.getMoveBlockingTask()); + roomUnit.setGoalLocation(tile); } } else { diff --git a/src/main/java/com/eu/habbo/threading/runnables/RoomUnitWalkToLocation.java b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitWalkToLocation.java index cb3e2935..21356e91 100644 --- a/src/main/java/com/eu/habbo/threading/runnables/RoomUnitWalkToLocation.java +++ b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitWalkToLocation.java @@ -29,17 +29,17 @@ public class RoomUnitWalkToLocation implements Runnable { return; } - if (!this.walker.getGoal().equals(this.goalTile)) { - onFail(); - return; - } - if (this.walker.getCurrentLocation().equals(this.goalTile)) { onSuccess(); return; } - Emulator.getThreading().run(this, 500); + if (!this.walker.getGoal().equals(this.goalTile)) { + onFail(); + return; + } + + Emulator.getThreading().run(this, 250); } private void onSuccess() { From 4389d7e18fa605792d30cbf4d0c2f493ff5dcfd0 Mon Sep 17 00:00:00 2001 From: Alejandro <25-alejandro@users.noreply.git.krews.org> Date: Thu, 6 Feb 2020 01:01:39 +0200 Subject: [PATCH 2/4] Remove unnecessary console log --- .../habbo/messages/incoming/rooms/users/RoomUserWalkEvent.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserWalkEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserWalkEvent.java index 920a4d77..c14d6f66 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserWalkEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserWalkEvent.java @@ -118,7 +118,6 @@ public class RoomUserWalkEvent extends MessageHandler { // This is where we set the end location and begin finding a path if (tile.isWalkable() || room.canSitOrLayAt(tile.x, tile.y)) { if (roomUnit.getMoveBlockingTask() != null) roomUnit.getMoveBlockingTask().get(); - System.out.println(roomUnit.getMoveBlockingTask()); roomUnit.setGoalLocation(tile); } From b87cbd398bcd780a1e02509720b6fd29adca083a Mon Sep 17 00:00:00 2001 From: Alejandro <25-alejandro@users.noreply.git.krews.org> Date: Thu, 6 Feb 2020 01:06:49 +0200 Subject: [PATCH 3/4] Do not cancel navigation if overriding path is non-existent --- .../java/com/eu/habbo/habbohotel/rooms/RoomLayout.java | 2 +- .../java/com/eu/habbo/habbohotel/rooms/RoomUnit.java | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomLayout.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomLayout.java index 6d620b2d..3f99af34 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomLayout.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomLayout.java @@ -317,7 +317,7 @@ public class RoomLayout { return this.findPath(oldTile, newTile, goalLocation, roomUnit, true); } - return new LinkedList<>(); + return null; } private RoomTile findTile(List tiles, short x, short y) { diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnit.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnit.java index 47489f78..a876a4d4 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnit.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnit.java @@ -177,6 +177,9 @@ public class RoomUnit { } Deque peekPath = room.getLayout().findPath(this.currentLocation, this.path.peek(), this.goalLocation, this); + + if (peekPath == null) peekPath = new LinkedList<>(); + if (peekPath.size() >= 3) { if (path.isEmpty()) return true; @@ -543,10 +546,9 @@ public class RoomUnit { public void findPath() { - if (this.room != null && this.room.getLayout() != null && this.goalLocation != null && (this.goalLocation.isWalkable() || this.room.canSitOrLayAt(this.goalLocation.x, this.goalLocation.y) || this.canOverrideTile(this.goalLocation))) - { - - this.path = this.room.getLayout().findPath(this.currentLocation, this.goalLocation, this.goalLocation, this); + if (this.room != null && this.room.getLayout() != null && this.goalLocation != null && (this.goalLocation.isWalkable() || this.room.canSitOrLayAt(this.goalLocation.x, this.goalLocation.y) || this.canOverrideTile(this.goalLocation))) { + Deque path = this.room.getLayout().findPath(this.currentLocation, this.goalLocation, this.goalLocation, this); + if (path != null) this.path = path; } } From df8f80f9cb55fdcb32152e9cb61784823a9ff6e5 Mon Sep 17 00:00:00 2001 From: Alejandro <25-alejandro@users.noreply.git.krews.org> Date: Thu, 6 Feb 2020 01:16:51 +0200 Subject: [PATCH 4/4] Add vending machines without sides --- .../habbo/habbohotel/items/ItemManager.java | 1 + .../InteractionNoSidesVendingMachine.java | 24 +++++++++++++++++++ .../InteractionVendingMachine.java | 6 ++++- 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionNoSidesVendingMachine.java diff --git a/src/main/java/com/eu/habbo/habbohotel/items/ItemManager.java b/src/main/java/com/eu/habbo/habbohotel/items/ItemManager.java index cde2f0e3..4e6969e2 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/ItemManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/ItemManager.java @@ -178,6 +178,7 @@ public class ItemManager { this.interactionsList.add(new ItemInteraction("effect_tile_group", InteractionEffectTile.class)); this.interactionsList.add(new ItemInteraction("crackable_subscription_box", InteractionRedeemableSubscriptionBox.class)); this.interactionsList.add(new ItemInteraction("random_state", InteractionRandomState.class)); + this.interactionsList.add(new ItemInteraction("vendingmachine_no_sides", InteractionNoSidesVendingMachine.class)); this.interactionsList.add(new ItemInteraction("game_timer", InteractionGameTimer.class)); diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionNoSidesVendingMachine.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionNoSidesVendingMachine.java new file mode 100644 index 00000000..367d500e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionNoSidesVendingMachine.java @@ -0,0 +1,24 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.Habbo; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionNoSidesVendingMachine extends InteractionVendingMachine { + public InteractionNoSidesVendingMachine(ResultSet set, Item baseItem) throws SQLException { + super(set, baseItem); + } + + public InteractionNoSidesVendingMachine(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public RoomTile getRequiredTile(Habbo habbo, Room room) { + return habbo.getRoomUnit().getClosestAdjacentTile(this.getX(), this.getY(), true); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionVendingMachine.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionVendingMachine.java index 50d66b91..4ddc40bf 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionVendingMachine.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionVendingMachine.java @@ -46,7 +46,7 @@ public class InteractionVendingMachine extends HabboItem { super.onClick(client, room, objects); if (client != null) { - RoomTile tile = getSquareInFront(room.getLayout(), this); + RoomTile tile = this.getRequiredTile(client.getHabbo(), room); if (tile != null) { if (tile.equals(client.getHabbo().getRoomUnit().getCurrentLocation())) { @@ -207,4 +207,8 @@ public class InteractionVendingMachine extends HabboItem { public void giveVendingMachineItem(Habbo habbo, Room room) { Emulator.getThreading().run(new RoomUnitGiveHanditem(habbo.getRoomUnit(), room, this.getBaseItem().getRandomVendingItem())); } + + public RoomTile getRequiredTile(Habbo habbo, Room room) { + return getSquareInFront(room.getLayout(), this); + } }