You've already forked Arcturus-Morningstar-Extended
mirror of
https://github.com/duckietm/Arcturus-Morningstar-Extended.git
synced 2026-06-19 15:06:19 +00:00
feat(wired): add altitude and relative move effects
This commit is contained in:
@@ -269,6 +269,8 @@ public class ItemManager {
|
|||||||
this.interactionsList.add(new ItemInteraction("wf_act_furni_to_user", WiredEffectFurniToUser.class));
|
this.interactionsList.add(new ItemInteraction("wf_act_furni_to_user", WiredEffectFurniToUser.class));
|
||||||
this.interactionsList.add(new ItemInteraction("wf_act_user_to_furni", WiredEffectUserToFurni.class));
|
this.interactionsList.add(new ItemInteraction("wf_act_user_to_furni", WiredEffectUserToFurni.class));
|
||||||
this.interactionsList.add(new ItemInteraction("wf_act_furni_to_furni", WiredEffectFurniToFurni.class));
|
this.interactionsList.add(new ItemInteraction("wf_act_furni_to_furni", WiredEffectFurniToFurni.class));
|
||||||
|
this.interactionsList.add(new ItemInteraction("wf_act_set_altitude", WiredEffectSetAltitude.class));
|
||||||
|
this.interactionsList.add(new ItemInteraction("wf_act_rel_mov", WiredEffectRelativeMove.class));
|
||||||
this.interactionsList.add(new ItemInteraction("wf_slc_furni_area", WiredEffectFurniArea.class));
|
this.interactionsList.add(new ItemInteraction("wf_slc_furni_area", WiredEffectFurniArea.class));
|
||||||
this.interactionsList.add(new ItemInteraction("wf_slc_furni_neighborhood", WiredEffectFurniNeighborhood.class));
|
this.interactionsList.add(new ItemInteraction("wf_slc_furni_neighborhood", WiredEffectFurniNeighborhood.class));
|
||||||
this.interactionsList.add(new ItemInteraction("wf_slc_furni_bytype", WiredEffectFurniByType.class));
|
this.interactionsList.add(new ItemInteraction("wf_slc_furni_bytype", WiredEffectFurniByType.class));
|
||||||
|
|||||||
+283
@@ -0,0 +1,283 @@
|
|||||||
|
package com.eu.habbo.habbohotel.items.interactions.wired.effects;
|
||||||
|
|
||||||
|
import com.eu.habbo.Emulator;
|
||||||
|
import com.eu.habbo.habbohotel.gameclients.GameClient;
|
||||||
|
import com.eu.habbo.habbohotel.items.Item;
|
||||||
|
import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect;
|
||||||
|
import com.eu.habbo.habbohotel.items.interactions.wired.WiredSettings;
|
||||||
|
import com.eu.habbo.habbohotel.rooms.Room;
|
||||||
|
import com.eu.habbo.habbohotel.rooms.RoomTile;
|
||||||
|
import com.eu.habbo.habbohotel.rooms.RoomUnit;
|
||||||
|
import com.eu.habbo.habbohotel.users.HabboItem;
|
||||||
|
import com.eu.habbo.habbohotel.wired.WiredEffectType;
|
||||||
|
import com.eu.habbo.habbohotel.wired.core.WiredContext;
|
||||||
|
import com.eu.habbo.habbohotel.wired.core.WiredManager;
|
||||||
|
import com.eu.habbo.habbohotel.wired.core.WiredSourceUtil;
|
||||||
|
import com.eu.habbo.messages.ServerMessage;
|
||||||
|
import com.eu.habbo.messages.incoming.wired.WiredSaveException;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class WiredEffectRelativeMove extends InteractionWiredEffect {
|
||||||
|
private static final int HORIZONTAL_NEGATIVE = 0;
|
||||||
|
private static final int HORIZONTAL_POSITIVE = 1;
|
||||||
|
private static final int VERTICAL_NEGATIVE = 0;
|
||||||
|
private static final int VERTICAL_POSITIVE = 1;
|
||||||
|
private static final int MAX_DISTANCE = 20;
|
||||||
|
|
||||||
|
public static final WiredEffectType type = WiredEffectType.RELATIVE_MOVE;
|
||||||
|
|
||||||
|
private final List<HabboItem> items = new ArrayList<>();
|
||||||
|
private int horizontalDirection = HORIZONTAL_POSITIVE;
|
||||||
|
private int horizontalDistance = 0;
|
||||||
|
private int verticalDirection = VERTICAL_POSITIVE;
|
||||||
|
private int verticalDistance = 0;
|
||||||
|
private int furniSource = WiredSourceUtil.SOURCE_TRIGGER;
|
||||||
|
|
||||||
|
public WiredEffectRelativeMove(ResultSet set, Item baseItem) throws SQLException {
|
||||||
|
super(set, baseItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
public WiredEffectRelativeMove(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) {
|
||||||
|
super(id, userId, item, extradata, limitedStack, limitedSells);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(WiredContext ctx) {
|
||||||
|
Room room = ctx.room();
|
||||||
|
if (room == null || room.getLayout() == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<HabboItem> effectiveItems = WiredSourceUtil.resolveItems(ctx, this.furniSource, this.items);
|
||||||
|
|
||||||
|
if (this.furniSource == WiredSourceUtil.SOURCE_SELECTED) {
|
||||||
|
this.items.removeIf(item -> item == null
|
||||||
|
|| item.getRoomId() != this.getRoomId()
|
||||||
|
|| room.getHabboItem(item.getId()) == null);
|
||||||
|
}
|
||||||
|
|
||||||
|
int deltaX = this.getHorizontalOffset();
|
||||||
|
int deltaY = this.getVerticalOffset();
|
||||||
|
|
||||||
|
if (deltaX == 0 && deltaY == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (HabboItem item : effectiveItems) {
|
||||||
|
if (item == null || item.getRoomId() != this.getRoomId()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
short targetX = (short) (item.getX() + deltaX);
|
||||||
|
short targetY = (short) (item.getY() + deltaY);
|
||||||
|
|
||||||
|
RoomTile targetTile = room.getLayout().getTile(targetX, targetY);
|
||||||
|
if (targetTile == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
room.moveFurniTo(item, targetTile, item.getRotation(), null, true, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
@Override
|
||||||
|
public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getWiredData() {
|
||||||
|
return WiredManager.getGson().toJson(new JsonData(
|
||||||
|
this.getDelay(),
|
||||||
|
this.items.stream().map(HabboItem::getId).collect(Collectors.toList()),
|
||||||
|
this.horizontalDirection,
|
||||||
|
this.horizontalDistance,
|
||||||
|
this.verticalDirection,
|
||||||
|
this.verticalDistance,
|
||||||
|
this.furniSource
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void loadWiredData(ResultSet set, Room room) throws SQLException {
|
||||||
|
this.items.clear();
|
||||||
|
String wiredData = set.getString("wired_data");
|
||||||
|
|
||||||
|
if (wiredData != null && wiredData.startsWith("{")) {
|
||||||
|
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
|
||||||
|
this.setDelay(data.delay);
|
||||||
|
this.horizontalDirection = this.normalizeBinary(data.horizontalDirection, HORIZONTAL_POSITIVE);
|
||||||
|
this.horizontalDistance = this.normalizeDistance(data.horizontalDistance);
|
||||||
|
this.verticalDirection = this.normalizeBinary(data.verticalDirection, VERTICAL_POSITIVE);
|
||||||
|
this.verticalDistance = this.normalizeDistance(data.verticalDistance);
|
||||||
|
this.furniSource = data.furniSource;
|
||||||
|
|
||||||
|
if (data.itemIds != null) {
|
||||||
|
for (Integer id : data.itemIds) {
|
||||||
|
HabboItem item = room.getHabboItem(id);
|
||||||
|
|
||||||
|
if (item != null) {
|
||||||
|
this.items.add(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.horizontalDirection = HORIZONTAL_POSITIVE;
|
||||||
|
this.horizontalDistance = 0;
|
||||||
|
this.verticalDirection = VERTICAL_POSITIVE;
|
||||||
|
this.verticalDistance = 0;
|
||||||
|
this.furniSource = WiredSourceUtil.SOURCE_TRIGGER;
|
||||||
|
this.setDelay(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPickUp() {
|
||||||
|
this.items.clear();
|
||||||
|
this.horizontalDirection = HORIZONTAL_POSITIVE;
|
||||||
|
this.horizontalDistance = 0;
|
||||||
|
this.verticalDirection = VERTICAL_POSITIVE;
|
||||||
|
this.verticalDistance = 0;
|
||||||
|
this.furniSource = WiredSourceUtil.SOURCE_TRIGGER;
|
||||||
|
this.setDelay(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public WiredEffectType getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void serializeWiredData(ServerMessage message, Room room) {
|
||||||
|
List<HabboItem> itemsSnapshot = new ArrayList<>(this.items);
|
||||||
|
itemsSnapshot.removeIf(item -> item == null
|
||||||
|
|| item.getRoomId() != this.getRoomId()
|
||||||
|
|| room.getHabboItem(item.getId()) == null);
|
||||||
|
|
||||||
|
this.items.clear();
|
||||||
|
this.items.addAll(itemsSnapshot);
|
||||||
|
|
||||||
|
message.appendBoolean(false);
|
||||||
|
message.appendInt(WiredManager.MAXIMUM_FURNI_SELECTION);
|
||||||
|
message.appendInt(itemsSnapshot.size());
|
||||||
|
for (HabboItem item : itemsSnapshot) {
|
||||||
|
message.appendInt(item.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
message.appendInt(this.getBaseItem().getSpriteId());
|
||||||
|
message.appendInt(this.getId());
|
||||||
|
message.appendString("");
|
||||||
|
message.appendInt(5);
|
||||||
|
message.appendInt(this.horizontalDirection);
|
||||||
|
message.appendInt(this.horizontalDistance);
|
||||||
|
message.appendInt(this.verticalDirection);
|
||||||
|
message.appendInt(this.verticalDistance);
|
||||||
|
message.appendInt(this.furniSource);
|
||||||
|
message.appendInt(0);
|
||||||
|
message.appendInt(this.getType().code);
|
||||||
|
message.appendInt(this.getDelay());
|
||||||
|
message.appendInt(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean saveData(WiredSettings settings, GameClient gameClient) throws WiredSaveException {
|
||||||
|
int[] params = settings.getIntParams();
|
||||||
|
|
||||||
|
if (params.length < 5) {
|
||||||
|
throw new WiredSaveException("Invalid data");
|
||||||
|
}
|
||||||
|
|
||||||
|
this.horizontalDirection = this.normalizeBinary(params[0], HORIZONTAL_POSITIVE);
|
||||||
|
this.horizontalDistance = this.normalizeDistance(params[1]);
|
||||||
|
this.verticalDirection = this.normalizeBinary(params[2], VERTICAL_POSITIVE);
|
||||||
|
this.verticalDistance = this.normalizeDistance(params[3]);
|
||||||
|
this.furniSource = params[4];
|
||||||
|
|
||||||
|
int delay = settings.getDelay();
|
||||||
|
if (delay > Emulator.getConfig().getInt("hotel.wired.max_delay", 20)) {
|
||||||
|
throw new WiredSaveException("Delay too long");
|
||||||
|
}
|
||||||
|
|
||||||
|
Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId());
|
||||||
|
if (room == null) {
|
||||||
|
throw new WiredSaveException("Room not found");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (settings.getFurniIds().length > Emulator.getConfig().getInt("hotel.wired.furni.selection.count")) {
|
||||||
|
throw new WiredSaveException("Too many furni selected");
|
||||||
|
}
|
||||||
|
|
||||||
|
List<HabboItem> newItems = new ArrayList<>();
|
||||||
|
for (int itemId : settings.getFurniIds()) {
|
||||||
|
HabboItem item = room.getHabboItem(itemId);
|
||||||
|
|
||||||
|
if (item == null) {
|
||||||
|
throw new WiredSaveException(String.format("Item %s not found", itemId));
|
||||||
|
}
|
||||||
|
|
||||||
|
newItems.add(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.items.clear();
|
||||||
|
this.items.addAll(newItems);
|
||||||
|
this.setDelay(delay);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getHorizontalOffset() {
|
||||||
|
if (this.horizontalDistance <= 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (this.horizontalDirection == HORIZONTAL_NEGATIVE) ? -this.horizontalDistance : this.horizontalDistance;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getVerticalOffset() {
|
||||||
|
if (this.verticalDistance <= 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (this.verticalDirection == VERTICAL_NEGATIVE) ? -this.verticalDistance : this.verticalDistance;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int normalizeBinary(int value, int fallback) {
|
||||||
|
if (value == 0 || value == 1) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return fallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int normalizeDistance(int value) {
|
||||||
|
return Math.max(0, Math.min(MAX_DISTANCE, value));
|
||||||
|
}
|
||||||
|
|
||||||
|
static class JsonData {
|
||||||
|
int delay;
|
||||||
|
List<Integer> itemIds;
|
||||||
|
int horizontalDirection;
|
||||||
|
int horizontalDistance;
|
||||||
|
int verticalDirection;
|
||||||
|
int verticalDistance;
|
||||||
|
int furniSource;
|
||||||
|
|
||||||
|
public JsonData(int delay, List<Integer> itemIds, int horizontalDirection, int horizontalDistance, int verticalDirection, int verticalDistance, int furniSource) {
|
||||||
|
this.delay = delay;
|
||||||
|
this.itemIds = itemIds;
|
||||||
|
this.horizontalDirection = horizontalDirection;
|
||||||
|
this.horizontalDistance = horizontalDistance;
|
||||||
|
this.verticalDirection = verticalDirection;
|
||||||
|
this.verticalDistance = verticalDistance;
|
||||||
|
this.furniSource = furniSource;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+288
@@ -0,0 +1,288 @@
|
|||||||
|
package com.eu.habbo.habbohotel.items.interactions.wired.effects;
|
||||||
|
|
||||||
|
import com.eu.habbo.Emulator;
|
||||||
|
import com.eu.habbo.habbohotel.gameclients.GameClient;
|
||||||
|
import com.eu.habbo.habbohotel.items.Item;
|
||||||
|
import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect;
|
||||||
|
import com.eu.habbo.habbohotel.items.interactions.wired.WiredSettings;
|
||||||
|
import com.eu.habbo.habbohotel.rooms.Room;
|
||||||
|
import com.eu.habbo.habbohotel.rooms.RoomTile;
|
||||||
|
import com.eu.habbo.habbohotel.rooms.RoomUnit;
|
||||||
|
import com.eu.habbo.habbohotel.users.HabboItem;
|
||||||
|
import com.eu.habbo.habbohotel.wired.WiredEffectType;
|
||||||
|
import com.eu.habbo.habbohotel.wired.core.WiredContext;
|
||||||
|
import com.eu.habbo.habbohotel.wired.core.WiredManager;
|
||||||
|
import com.eu.habbo.habbohotel.wired.core.WiredSourceUtil;
|
||||||
|
import com.eu.habbo.messages.ServerMessage;
|
||||||
|
import com.eu.habbo.messages.incoming.wired.WiredSaveException;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.math.RoundingMode;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class WiredEffectSetAltitude extends InteractionWiredEffect {
|
||||||
|
private static final Pattern ALTITUDE_PATTERN = Pattern.compile("^\\d+(\\.\\d{1,2})?$");
|
||||||
|
|
||||||
|
private static final int OPERATOR_INCREASE = 0;
|
||||||
|
private static final int OPERATOR_DECREASE = 1;
|
||||||
|
private static final int OPERATOR_SET = 2;
|
||||||
|
|
||||||
|
public static final WiredEffectType type = WiredEffectType.SET_ALTITUDE;
|
||||||
|
|
||||||
|
private final List<HabboItem> items = new ArrayList<>();
|
||||||
|
private int operator = OPERATOR_SET;
|
||||||
|
private double altitude = 0.0D;
|
||||||
|
private int furniSource = WiredSourceUtil.SOURCE_TRIGGER;
|
||||||
|
|
||||||
|
public WiredEffectSetAltitude(ResultSet set, Item baseItem) throws SQLException {
|
||||||
|
super(set, baseItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
public WiredEffectSetAltitude(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) {
|
||||||
|
super(id, userId, item, extradata, limitedStack, limitedSells);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(WiredContext ctx) {
|
||||||
|
Room room = ctx.room();
|
||||||
|
if (room == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<HabboItem> effectiveItems = WiredSourceUtil.resolveItems(ctx, this.furniSource, this.items);
|
||||||
|
|
||||||
|
if (this.furniSource == WiredSourceUtil.SOURCE_SELECTED) {
|
||||||
|
this.items.removeIf(item -> item == null
|
||||||
|
|| item.getRoomId() != this.getRoomId()
|
||||||
|
|| room.getHabboItem(item.getId()) == null);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (HabboItem item : effectiveItems) {
|
||||||
|
if (item == null || item.getRoomId() != this.getRoomId()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
RoomTile tile = room.getLayout().getTile(item.getX(), item.getY());
|
||||||
|
if (tile == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
double nextAltitude = this.computeAltitude(item.getZ());
|
||||||
|
room.moveFurniTo(item, tile, item.getRotation(), nextAltitude, null, true, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
@Override
|
||||||
|
public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getWiredData() {
|
||||||
|
return WiredManager.getGson().toJson(new JsonData(
|
||||||
|
this.getDelay(),
|
||||||
|
this.items.stream().map(HabboItem::getId).collect(Collectors.toList()),
|
||||||
|
this.operator,
|
||||||
|
this.formatAltitude(this.altitude),
|
||||||
|
this.furniSource
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void loadWiredData(ResultSet set, Room room) throws SQLException {
|
||||||
|
this.items.clear();
|
||||||
|
String wiredData = set.getString("wired_data");
|
||||||
|
|
||||||
|
if (wiredData != null && wiredData.startsWith("{")) {
|
||||||
|
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
|
||||||
|
this.setDelay(data.delay);
|
||||||
|
this.operator = this.normalizeOperator(data.operator);
|
||||||
|
this.altitude = this.parseAltitudeOrDefault(data.altitude);
|
||||||
|
this.furniSource = data.furniSource;
|
||||||
|
|
||||||
|
if (data.itemIds != null) {
|
||||||
|
for (Integer id : data.itemIds) {
|
||||||
|
HabboItem item = room.getHabboItem(id);
|
||||||
|
|
||||||
|
if (item != null) {
|
||||||
|
this.items.add(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.operator = OPERATOR_SET;
|
||||||
|
this.altitude = 0.0D;
|
||||||
|
this.furniSource = WiredSourceUtil.SOURCE_TRIGGER;
|
||||||
|
this.setDelay(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPickUp() {
|
||||||
|
this.items.clear();
|
||||||
|
this.operator = OPERATOR_SET;
|
||||||
|
this.altitude = 0.0D;
|
||||||
|
this.furniSource = WiredSourceUtil.SOURCE_TRIGGER;
|
||||||
|
this.setDelay(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public WiredEffectType getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void serializeWiredData(ServerMessage message, Room room) {
|
||||||
|
List<HabboItem> itemsSnapshot = new ArrayList<>(this.items);
|
||||||
|
itemsSnapshot.removeIf(item -> item == null
|
||||||
|
|| item.getRoomId() != this.getRoomId()
|
||||||
|
|| room.getHabboItem(item.getId()) == null);
|
||||||
|
|
||||||
|
this.items.clear();
|
||||||
|
this.items.addAll(itemsSnapshot);
|
||||||
|
|
||||||
|
message.appendBoolean(false);
|
||||||
|
message.appendInt(WiredManager.MAXIMUM_FURNI_SELECTION);
|
||||||
|
message.appendInt(itemsSnapshot.size());
|
||||||
|
for (HabboItem item : itemsSnapshot) {
|
||||||
|
message.appendInt(item.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
message.appendInt(this.getBaseItem().getSpriteId());
|
||||||
|
message.appendInt(this.getId());
|
||||||
|
message.appendString(this.formatAltitude(this.altitude));
|
||||||
|
message.appendInt(2);
|
||||||
|
message.appendInt(this.operator);
|
||||||
|
message.appendInt(this.furniSource);
|
||||||
|
message.appendInt(0);
|
||||||
|
message.appendInt(this.getType().code);
|
||||||
|
message.appendInt(this.getDelay());
|
||||||
|
message.appendInt(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean saveData(WiredSettings settings, GameClient gameClient) throws WiredSaveException {
|
||||||
|
int[] params = settings.getIntParams();
|
||||||
|
this.operator = (params.length > 0) ? this.normalizeOperator(params[0]) : OPERATOR_SET;
|
||||||
|
this.furniSource = (params.length > 1) ? params[1] : WiredSourceUtil.SOURCE_TRIGGER;
|
||||||
|
|
||||||
|
int delay = settings.getDelay();
|
||||||
|
if (delay > Emulator.getConfig().getInt("hotel.wired.max_delay", 20)) {
|
||||||
|
throw new WiredSaveException("Delay too long");
|
||||||
|
}
|
||||||
|
|
||||||
|
Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId());
|
||||||
|
if (room == null) {
|
||||||
|
throw new WiredSaveException("Room not found");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (settings.getFurniIds().length > Emulator.getConfig().getInt("hotel.wired.furni.selection.count")) {
|
||||||
|
throw new WiredSaveException("Too many furni selected");
|
||||||
|
}
|
||||||
|
|
||||||
|
List<HabboItem> newItems = new ArrayList<>();
|
||||||
|
for (int itemId : settings.getFurniIds()) {
|
||||||
|
HabboItem item = room.getHabboItem(itemId);
|
||||||
|
|
||||||
|
if (item == null) {
|
||||||
|
throw new WiredSaveException(String.format("Item %s not found", itemId));
|
||||||
|
}
|
||||||
|
|
||||||
|
newItems.add(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.altitude = this.parseAltitude(settings.getStringParam());
|
||||||
|
this.items.clear();
|
||||||
|
this.items.addAll(newItems);
|
||||||
|
this.setDelay(delay);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int normalizeOperator(int value) {
|
||||||
|
if (value < OPERATOR_INCREASE || value > OPERATOR_SET) {
|
||||||
|
return OPERATOR_SET;
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private double computeAltitude(double currentAltitude) {
|
||||||
|
double nextAltitude;
|
||||||
|
|
||||||
|
switch (this.operator) {
|
||||||
|
case OPERATOR_INCREASE:
|
||||||
|
nextAltitude = currentAltitude + this.altitude;
|
||||||
|
break;
|
||||||
|
case OPERATOR_DECREASE:
|
||||||
|
nextAltitude = currentAltitude - this.altitude;
|
||||||
|
break;
|
||||||
|
case OPERATOR_SET:
|
||||||
|
default:
|
||||||
|
nextAltitude = this.altitude;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.normalizeAltitude(nextAltitude);
|
||||||
|
}
|
||||||
|
|
||||||
|
private double parseAltitude(String value) throws WiredSaveException {
|
||||||
|
String normalized = (value != null) ? value.trim() : "";
|
||||||
|
|
||||||
|
if (normalized.isEmpty()) {
|
||||||
|
return 0.0D;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ALTITUDE_PATTERN.matcher(normalized).matches()) {
|
||||||
|
throw new WiredSaveException("Invalid altitude value");
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
return this.normalizeAltitude(new BigDecimal(normalized).doubleValue());
|
||||||
|
} catch (NumberFormatException exception) {
|
||||||
|
throw new WiredSaveException("Invalid altitude value");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private double parseAltitudeOrDefault(String value) {
|
||||||
|
try {
|
||||||
|
return this.parseAltitude(value);
|
||||||
|
} catch (WiredSaveException exception) {
|
||||||
|
return 0.0D;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private double normalizeAltitude(double value) {
|
||||||
|
double clampedValue = Math.max(0.0D, Math.min(Room.MAXIMUM_FURNI_HEIGHT, value));
|
||||||
|
return BigDecimal.valueOf(clampedValue).setScale(2, RoundingMode.HALF_UP).doubleValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String formatAltitude(double value) {
|
||||||
|
BigDecimal decimal = BigDecimal.valueOf(this.normalizeAltitude(value)).stripTrailingZeros();
|
||||||
|
return (decimal.scale() < 0 ? decimal.setScale(0, RoundingMode.DOWN) : decimal).toPlainString();
|
||||||
|
}
|
||||||
|
|
||||||
|
static class JsonData {
|
||||||
|
int delay;
|
||||||
|
List<Integer> itemIds;
|
||||||
|
int operator;
|
||||||
|
String altitude;
|
||||||
|
int furniSource;
|
||||||
|
|
||||||
|
public JsonData(int delay, List<Integer> itemIds, int operator, String altitude, int furniSource) {
|
||||||
|
this.delay = delay;
|
||||||
|
this.itemIds = itemIds;
|
||||||
|
this.operator = operator;
|
||||||
|
this.altitude = altitude;
|
||||||
|
this.furniSource = furniSource;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -37,7 +37,9 @@ public enum WiredEffectType {
|
|||||||
UNFREEZE(35),
|
UNFREEZE(35),
|
||||||
FURNI_TO_USER(36),
|
FURNI_TO_USER(36),
|
||||||
USER_TO_FURNI(37),
|
USER_TO_FURNI(37),
|
||||||
FURNI_TO_FURNI(38);
|
FURNI_TO_FURNI(38),
|
||||||
|
SET_ALTITUDE(39),
|
||||||
|
RELATIVE_MOVE(40);
|
||||||
|
|
||||||
public final int code;
|
public final int code;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user