Make bots walk to nearest adjacent tile when giving a handitem

This commit is contained in:
Alejandro 2020-02-05 19:35:25 +02:00
parent 95b0884a8c
commit 82ff5c0a08
3 changed files with 32 additions and 28 deletions

View File

@ -42,18 +42,9 @@ public class InteractionPuzzleBox extends HabboItem {
}
if (rotation == null) {
Optional<RoomTile> nearestTile = Arrays.stream(
new RoomTile[]{
room.getLayout().getTileInFront(room.getLayout().getTile(this.getX(), this.getY()), RoomUserRotation.SOUTH.getValue()),
room.getLayout().getTileInFront(room.getLayout().getTile(this.getX(), this.getY()), RoomUserRotation.NORTH.getValue()),
room.getLayout().getTileInFront(room.getLayout().getTile(this.getX(), this.getY()), RoomUserRotation.EAST.getValue()),
room.getLayout().getTileInFront(room.getLayout().getTile(this.getX(), this.getY()), RoomUserRotation.WEST.getValue())
}
)
.filter(t -> t != null && t.isWalkable() && !room.hasHabbosAt(t.x, t.y))
.min(Comparator.comparingDouble(a -> a.distance(client.getHabbo().getRoomUnit().getCurrentLocation())));
RoomTile nearestTile = client.getHabbo().getRoomUnit().getClosestAdjacentTile(this.getX(), this.getY(), false);
nearestTile.ifPresent(roomTile -> client.getHabbo().getRoomUnit().setGoalLocation(roomTile));
if (nearestTile != null) client.getHabbo().getRoomUnit().setGoalLocation(nearestTile);
return;
}

View File

@ -3,7 +3,10 @@ package com.eu.habbo.habbohotel.rooms;
import com.eu.habbo.Emulator;
import com.eu.habbo.habbohotel.bots.Bot;
import com.eu.habbo.habbohotel.items.Item;
import com.eu.habbo.habbohotel.items.interactions.*;
import com.eu.habbo.habbohotel.items.interactions.InteractionGuildGate;
import com.eu.habbo.habbohotel.items.interactions.InteractionHabboClubGate;
import com.eu.habbo.habbohotel.items.interactions.InteractionWater;
import com.eu.habbo.habbohotel.items.interactions.InteractionWaterItem;
import com.eu.habbo.habbohotel.pets.Pet;
import com.eu.habbo.habbohotel.pets.RideablePet;
import com.eu.habbo.habbohotel.users.DanceType;
@ -22,9 +25,7 @@ import gnu.trove.map.TMap;
import gnu.trove.map.hash.THashMap;
import gnu.trove.set.hash.THashSet;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Map;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
public class RoomUnit {
@ -743,4 +744,28 @@ public class RoomUnit {
return topItem == null || (!(topItem instanceof InteractionWater) && !(topItem instanceof InteractionWaterItem));
}
public RoomTile getClosestAdjacentTile(short x, short y, boolean diagonal) {
RoomTile baseTile = room.getLayout().getTile(x, y);
if (baseTile == null) return null;
List<Integer> rotations = new ArrayList<>();
rotations.add(RoomUserRotation.SOUTH.getValue());
rotations.add(RoomUserRotation.NORTH.getValue());
rotations.add(RoomUserRotation.EAST.getValue());
rotations.add(RoomUserRotation.WEST.getValue());
if (diagonal) {
rotations.add(RoomUserRotation.NORTH_EAST.getValue());
rotations.add(RoomUserRotation.NORTH_WEST.getValue());
rotations.add(RoomUserRotation.SOUTH_EAST.getValue());
rotations.add(RoomUserRotation.SOUTH_WEST.getValue());
}
return rotations.stream()
.map(rotation -> room.getLayout().getTileInFront(baseTile, rotation))
.filter(t -> t != null && t.isWalkable() && !room.hasHabbosAt(t.x, t.y))
.min(Comparator.comparingDouble(a -> a.distance(this.getCurrentLocation()))).orElse(null);
}
}

View File

@ -74,23 +74,11 @@ public class RoomUnitWalkToRoomUnit implements Runnable {
}
private void findNewLocation() {
this.goalTile = this.room.getLayout().getTileInFront(this.target.getCurrentLocation(), this.target.getBodyRotation().getValue());
this.goalTile = this.walker.getClosestAdjacentTile(this.target.getCurrentLocation().x, this.target.getCurrentLocation().y, true);
if (this.goalTile == null)
return;
if (!this.room.tileWalkable(this.goalTile)) {
List<RoomTile> tiles = this.room.getLayout().getTilesAround(this.target.getCurrentLocation());
for (RoomTile t : tiles) {
if (this.room.tileWalkable(t)) {
this.goalTile = t;
break;
}
}
}
this.walker.setGoalLocation(this.goalTile);
if (this.walker.getPath().isEmpty() && this.failedReached != null) {