🆕 wf_slc_users_area and some wired updates

This commit is contained in:
duckietm
2026-03-06 11:30:48 +01:00
parent 2963324003
commit b0a0da455c
19 changed files with 301 additions and 94 deletions
@@ -48,6 +48,7 @@ import com.eu.habbo.habbohotel.items.interactions.totems.InteractionTotemPlanet;
import com.eu.habbo.habbohotel.items.interactions.wired.conditions.*;
import com.eu.habbo.habbohotel.items.interactions.wired.effects.*;
import com.eu.habbo.habbohotel.items.interactions.wired.selector.WiredEffectFurniArea;
import com.eu.habbo.habbohotel.items.interactions.wired.selector.WiredEffectUsersArea;
import com.eu.habbo.habbohotel.items.interactions.wired.selector.WiredEffectFurniNeighborhood;
import com.eu.habbo.habbohotel.items.interactions.wired.selector.WiredEffectFurniByType;
import com.eu.habbo.habbohotel.items.interactions.wired.extra.WiredBlob;
@@ -254,6 +255,7 @@ public class ItemManager {
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_bytype", WiredEffectFurniByType.class));
this.interactionsList.add(new ItemInteraction("wf_slc_users_area", WiredEffectUsersArea.class));
this.interactionsList.add(new ItemInteraction("wf_cnd_has_furni_on", WiredConditionFurniHaveFurni.class));
this.interactionsList.add(new ItemInteraction("wf_cnd_furnis_hv_avtrs", WiredConditionFurniHaveHabbo.class));
@@ -21,9 +21,11 @@ public class WiredEffectAlert extends WiredEffectWhisper {
@Override
public void execute(WiredContext ctx) {
Room room = ctx.room();
Habbo habbo = ctx.actor().map(room::getHabbo).orElse(null);
if (habbo != null) {
for (com.eu.habbo.habbohotel.rooms.RoomUnit unit : ctx.targets().users()) {
Habbo habbo = room.getHabbo(unit);
if (habbo == null) continue;
habbo.alert(this.message
.replace("%online%", Emulator.getGameEnvironment().getHabboManager().getOnlineCount() + "")
.replace("%username%", habbo.getHabboInfo().getUsername())
@@ -111,12 +111,15 @@ public class WiredEffectBotTalkToHabbo extends InteractionWiredEffect {
@Override
public void execute(WiredContext ctx) {
Room room = ctx.room();
RoomUnit roomUnit = ctx.actor().orElse(null);
if (roomUnit == null) return;
Habbo habbo = room.getHabbo(roomUnit);
List<Bot> bots = room.getBots(this.botName);
if (bots.size() != 1) return;
Bot bot = bots.get(0);
for (RoomUnit roomUnit : ctx.targets().users()) {
Habbo habbo = room.getHabbo(roomUnit);
if (habbo == null) continue;
if (habbo != null) {
String m = this.message;
m = m.replace(Emulator.getTexts().getValue("wired.variable.username", "%username%"), habbo.getHabboInfo().getUsername())
.replace(Emulator.getTexts().getValue("wired.variable.credits", "%credits%"), habbo.getHabboInfo().getCredits() + "")
@@ -128,15 +131,7 @@ public class WiredEffectBotTalkToHabbo extends InteractionWiredEffect {
.replace(Emulator.getTexts().getValue("wired.variable.roomname", "%roomname%"), room.getName())
.replace(Emulator.getTexts().getValue("wired.variable.user_count", "%user_count%"), room.getUserCount() + "");
List<Bot> bots = room.getBots(this.botName);
if (bots.size() != 1) {
return;
}
Bot bot = bots.get(0);
if(!WiredManager.triggerUserSays(room, bot.getRoomUnit(), m)) {
if (!WiredManager.triggerUserSays(room, bot.getRoomUnit(), m)) {
if (this.mode == 1) {
bot.whisper(m, habbo);
} else {
@@ -192,7 +187,7 @@ public class WiredEffectBotTalkToHabbo extends InteractionWiredEffect {
@Override
public boolean requiresTriggeringUser() {
return true;
return false;
}
static class JsonData {
@@ -28,10 +28,11 @@ public class WiredEffectGiveEffect extends WiredEffectWhisper {
}
Room room = ctx.room();
RoomUnit roomUnit = ctx.actor().orElse(null);
if (effectId >= 0 && roomUnit != null) {
room.giveEffect(roomUnit, effectId, Integer.MAX_VALUE);
if (effectId >= 0) {
for (RoomUnit roomUnit : ctx.targets().users()) {
room.giveEffect(roomUnit, effectId, Integer.MAX_VALUE);
}
}
}
}
@@ -23,10 +23,12 @@ public class WiredEffectGiveHandItem extends WiredEffectWhisper {
int itemId = Integer.parseInt(this.message);
Room room = ctx.room();
Habbo habbo = ctx.actor().map(room::getHabbo).orElse(null);
if (habbo != null) {
room.giveHandItem(habbo, itemId);
for (com.eu.habbo.habbohotel.rooms.RoomUnit unit : ctx.targets().users()) {
Habbo habbo = room.getHabbo(unit);
if (habbo != null) {
room.giveHandItem(habbo, itemId);
}
}
} catch (Exception e) {
}
@@ -88,13 +88,14 @@ public class WiredEffectGiveRespect extends InteractionWiredEffect {
@Override
public void execute(WiredContext ctx) {
Room room = ctx.room();
Habbo habbo = ctx.actor().map(room::getHabbo).orElse(null);
if (habbo == null)
return;
for (RoomUnit unit : ctx.targets().users()) {
Habbo habbo = room.getHabbo(unit);
if (habbo == null) continue;
habbo.getHabboStats().respectPointsReceived += this.respects;
AchievementManager.progressAchievement(habbo, Emulator.getGameEnvironment().getAchievementManager().getAchievement("RespectEarned"), this.respects);
habbo.getHabboStats().respectPointsReceived += this.respects;
AchievementManager.progressAchievement(habbo, Emulator.getGameEnvironment().getAchievementManager().getAchievement("RespectEarned"), this.respects);
}
}
@Override
@@ -52,13 +52,12 @@ public class WiredEffectGiveReward extends InteractionWiredEffect {
@Override
public void execute(WiredContext ctx) {
Room room = ctx.room();
RoomUnit roomUnit = ctx.actor().orElse(null);
if (roomUnit == null) return;
Habbo habbo = room.getHabbo(roomUnit);
if (habbo != null) {
WiredManager.getReward(habbo, this);
for (RoomUnit roomUnit : ctx.targets().users()) {
Habbo habbo = room.getHabbo(roomUnit);
if (habbo != null) {
WiredManager.getReward(habbo, this);
}
}
}
@@ -46,13 +46,15 @@ public class WiredEffectGiveScore extends InteractionWiredEffect {
@Override
public void execute(WiredContext ctx) {
Room room = ctx.room();
Habbo habbo = ctx.actor().map(room::getHabbo).orElse(null);
if (habbo != null && habbo.getHabboInfo().getCurrentGame() != null) {
for (RoomUnit unit : ctx.targets().users()) {
Habbo habbo = room.getHabbo(unit);
if (habbo == null || habbo.getHabboInfo().getCurrentGame() == null) continue;
Game game = room.getGame(habbo.getHabboInfo().getCurrentGame());
if (game == null)
return;
continue;
int gameStartTime = game.getStartTime();
@@ -60,6 +62,7 @@ public class WiredEffectGiveScore extends InteractionWiredEffect {
TObjectIntIterator<Map.Entry<Integer, Integer>> iterator = dataClone.iterator();
boolean alreadyCounted = false;
for (int i = dataClone.size(); i-- > 0; ) {
iterator.advance();
@@ -72,7 +75,8 @@ public class WiredEffectGiveScore extends InteractionWiredEffect {
habbo.getHabboInfo().getGamePlayer().addScore(this.score, true);
return;
alreadyCounted = true;
break;
}
} else {
iterator.remove();
@@ -80,16 +84,17 @@ public class WiredEffectGiveScore extends InteractionWiredEffect {
}
}
try {
this.data.put(new AbstractMap.SimpleEntry<>(gameStartTime, habbo.getHabboInfo().getId()), 1);
}
catch(IllegalArgumentException e) {
if (!alreadyCounted) {
try {
this.data.put(new AbstractMap.SimpleEntry<>(gameStartTime, habbo.getHabboInfo().getId()), 1);
}
catch(IllegalArgumentException e) {
}
}
if (habbo.getHabboInfo().getGamePlayer() != null) {
habbo.getHabboInfo().getGamePlayer().addScore(this.score, true);
if (habbo.getHabboInfo().getGamePlayer() != null) {
habbo.getHabboInfo().getGamePlayer().addScore(this.score, true);
}
}
}
}
@@ -40,9 +40,11 @@ public class WiredEffectJoinTeam extends InteractionWiredEffect {
@Override
public void execute(WiredContext ctx) {
Room room = ctx.room();
Habbo habbo = ctx.actor().map(room::getHabbo).orElse(null);
if (habbo != null) {
for (RoomUnit unit : ctx.targets().users()) {
Habbo habbo = room.getHabbo(unit);
if (habbo == null) continue;
WiredGame game = (WiredGame) room.getGameOrCreate(WiredGame.class);
if (habbo.getHabboInfo().getGamePlayer() != null && habbo.getHabboInfo().getCurrentGame() != null && (habbo.getHabboInfo().getCurrentGame() != WiredGame.class || (habbo.getHabboInfo().getCurrentGame() == WiredGame.class && habbo.getHabboInfo().getGamePlayer().getTeamColor() != this.teamColor))) {
@@ -42,17 +42,19 @@ public class WiredEffectKickHabbo extends InteractionWiredEffect {
@Override
public void execute(WiredContext ctx) {
Room room = ctx.room();
Habbo habbo = ctx.actor().map(room::getHabbo).orElse(null);
if (habbo != null) {
for (RoomUnit unit : ctx.targets().users()) {
Habbo habbo = room.getHabbo(unit);
if (habbo == null) continue;
if (habbo.hasPermission(Permission.ACC_UNKICKABLE)) {
habbo.whisper(Emulator.getTexts().getValue("hotel.wired.kickexception.unkickable"));
return;
continue;
}
if (habbo.getHabboInfo().getId() == room.getOwnerId()) {
habbo.whisper(Emulator.getTexts().getValue("hotel.wired.kickexception.owner"));
return;
continue;
}
room.giveEffect(habbo, 4, 2);
@@ -37,9 +37,11 @@ public class WiredEffectLeaveTeam extends InteractionWiredEffect {
@Override
public void execute(WiredContext ctx) {
Room room = ctx.room();
Habbo habbo = ctx.actor().map(room::getHabbo).orElse(null);
if (habbo != null) {
for (RoomUnit unit : ctx.targets().users()) {
Habbo habbo = room.getHabbo(unit);
if (habbo == null) continue;
if (habbo.getHabboInfo().getCurrentGame() != null) {
Game game = room.getGame(habbo.getHabboInfo().getCurrentGame());
@@ -64,16 +64,13 @@ public class WiredEffectMuteHabbo extends InteractionWiredEffect {
@Override
public void execute(WiredContext ctx) {
RoomUnit roomUnit = ctx.actor().orElse(null);
if (roomUnit == null)
return;
Room room = ctx.room();
Habbo habbo = room.getHabbo(roomUnit);
if (habbo != null) {
if (room.hasRights(habbo))
return;
for (RoomUnit roomUnit : ctx.targets().users()) {
Habbo habbo = room.getHabbo(roomUnit);
if (habbo == null) continue;
if (room.hasRights(habbo)) continue;
room.muteHabbo(habbo, 60);
@@ -191,20 +191,21 @@ public class WiredEffectTeleport extends InteractionWiredEffect {
@Override
public void execute(WiredContext ctx) {
Room room = ctx.room();
RoomUnit roomUnit = ctx.actor().orElse(null);
if (roomUnit == null || room == null || room.getLayout() == null) {
if (room == null || room.getLayout() == null) {
return;
}
this.items.removeIf(item -> item == null || item.getRoomId() != this.getRoomId()
|| Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(item.getId()) == null);
if (!this.items.isEmpty()) {
if (this.items.isEmpty()) return;
for (RoomUnit roomUnit : ctx.targets().users()) {
int i = Emulator.getRandom().nextInt(this.items.size());
HabboItem item = this.items.get(i);
if (item == null) return;
if (item == null) continue;
RoomTile tile = room.getLayout().getTile(item.getX(), item.getY());
if (tile != null) {
@@ -91,21 +91,15 @@ public class WiredEffectWhisper extends InteractionWiredEffect {
public void execute(WiredContext ctx) {
Room room = ctx.room();
if (this.message.length() > 0) {
RoomUnit roomUnit = ctx.actor().orElse(null);
if (roomUnit != null) {
for (RoomUnit roomUnit : ctx.targets().users()) {
Habbo habbo = room.getHabbo(roomUnit);
if (habbo == null) continue;
if (habbo != null) {
String msg = this.message.replace("%user%", habbo.getHabboInfo().getUsername()).replace("%online_count%", Emulator.getGameEnvironment().getHabboManager().getOnlineCount() + "").replace("%room_count%", Emulator.getGameEnvironment().getRoomManager().getActiveRooms().size() + "");
habbo.getClient().sendResponse(new RoomUserWhisperComposer(new RoomChatMessage(msg, habbo, habbo, RoomChatMessageBubbles.WIRED)));
String msg = this.message.replace("%user%", habbo.getHabboInfo().getUsername()).replace("%online_count%", Emulator.getGameEnvironment().getHabboManager().getOnlineCount() + "").replace("%room_count%", Emulator.getGameEnvironment().getRoomManager().getActiveRooms().size() + "");
habbo.getClient().sendResponse(new RoomUserWhisperComposer(new RoomChatMessage(msg, habbo, habbo, RoomChatMessageBubbles.WIRED)));
if (habbo.getRoomUnit().isIdle()) {
habbo.getRoomUnit().getRoom().unIdle(habbo);
}
}
} else {
for (Habbo h : room.getHabbos()) {
h.getClient().sendResponse(new RoomUserWhisperComposer(new RoomChatMessage(this.message.replace("%user%", h.getHabboInfo().getUsername()).replace("%online_count%", Emulator.getGameEnvironment().getHabboManager().getOnlineCount() + "").replace("%room_count%", Emulator.getGameEnvironment().getRoomManager().getActiveRooms().size() + ""), h, h, RoomChatMessageBubbles.WIRED)));
if (habbo.getRoomUnit().isIdle()) {
habbo.getRoomUnit().getRoom().unIdle(habbo);
}
}
}
@@ -0,0 +1,172 @@
package com.eu.habbo.habbohotel.items.interactions.wired.selector;
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.RoomUnit;
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.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;
public class WiredEffectUsersArea extends InteractionWiredEffect {
public static final WiredEffectType type = WiredEffectType.USERS_AREA_SELECTOR;
private int rootX = 0;
private int rootY = 0;
private int areaWidth = 0;
private int areaHeight = 0;
private boolean filterExisting = false;
private boolean invert = false;
public WiredEffectUsersArea(ResultSet set, Item baseItem) throws SQLException {
super(set, baseItem);
}
public WiredEffectUsersArea(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 || areaWidth <= 0 || areaHeight <= 0) return;
int maxX = rootX + areaWidth - 1;
int maxY = rootY + areaHeight - 1;
List<RoomUnit> usersInArea = new ArrayList<>();
for (RoomUnit unit : room.getRoomUnits()) {
int x = unit.getX();
int y = unit.getY();
boolean inArea = x >= rootX && x <= maxX && y >= rootY && y <= maxY;
if (invert ? !inArea : inArea) {
usersInArea.add(unit);
}
}
if (filterExisting) {
usersInArea.retainAll(ctx.targets().users());
}
ctx.targets().setUsers(usersInArea);
}
@Override
public boolean saveData(WiredSettings settings, GameClient gameClient) throws WiredSaveException {
int[] params = settings.getIntParams();
if (params == null || params.length < 4) {
throw new WiredSaveException("wf_slc_users_area requires at least 4 int params: rootX, rootY, width, height");
}
this.rootX = params[0];
this.rootY = params[1];
this.areaWidth = params[2];
this.areaHeight = params[3];
this.filterExisting = params.length >= 5 && params[4] == 1;
this.invert = params.length >= 6 && params[5] == 1;
this.setDelay(settings.getDelay());
return true;
}
@Override
public WiredEffectType getType() {
return type;
}
@Override
public boolean isSelector() {
return true;
}
@Override
public String getWiredData() {
return WiredManager.getGson().toJson(new JsonData(rootX, rootY, areaWidth, areaHeight, filterExisting, invert, getDelay()));
}
@Override
public void loadWiredData(ResultSet set, Room room) throws SQLException {
String wiredData = set.getString("wired_data");
if (wiredData != null && wiredData.startsWith("{")) {
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
this.rootX = data.rootX;
this.rootY = data.rootY;
this.areaWidth = data.width;
this.areaHeight = data.height;
this.filterExisting = data.filterExisting;
this.invert = data.invert;
this.setDelay(data.delay);
}
}
@Override
public void onPickUp() {
this.rootX = 0;
this.rootY = 0;
this.areaWidth = 0;
this.areaHeight = 0;
this.filterExisting = false;
this.invert = false;
this.setDelay(0);
}
@Override
public void serializeWiredData(ServerMessage message, Room room) {
message.appendBoolean(false);
message.appendInt(0);
message.appendInt(0);
message.appendInt(this.getBaseItem().getSpriteId());
message.appendInt(this.getId());
message.appendString("");
message.appendInt(6);
message.appendInt(this.rootX);
message.appendInt(this.rootY);
message.appendInt(this.areaWidth);
message.appendInt(this.areaHeight);
message.appendInt(this.filterExisting ? 1 : 0);
message.appendInt(this.invert ? 1 : 0);
message.appendInt(0);
message.appendInt(this.getType().code);
message.appendInt(this.getDelay());
message.appendInt(0);
}
@Override
public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) {
return false;
}
static class JsonData {
int rootX;
int rootY;
int width;
int height;
boolean filterExisting;
boolean invert;
int delay;
JsonData(int rootX, int rootY, int width, int height, boolean filterExisting, boolean invert, int delay) {
this.rootX = rootX;
this.rootY = rootY;
this.width = width;
this.height = height;
this.filterExisting = filterExisting;
this.invert = invert;
this.delay = delay;
}
}
}
@@ -80,6 +80,7 @@ public class PetCommand implements Comparable<PetCommand> {
if (Emulator.getRandom().nextInt(100) >= obeyChance) {
pet.say(pet.getPetData().randomVocal(PetVocalsType.DISOBEY));
// Don't record execution on random disobey — player can retry immediately
return;
}
@@ -29,7 +29,8 @@ public enum WiredEffectType {
BOT_TALK_TO_AVATAR(27),
FURNI_AREA_SELECTOR(28),
FURNI_NEIGHBORHOOD_SELECTOR(29),
FURNI_BYTYPE_SELECTOR(30);
FURNI_BYTYPE_SELECTOR(30),
USERS_AREA_SELECTOR(31);
public final int code;
@@ -72,7 +72,11 @@ public interface IWiredEffect {
default long getCooldown() {
return 0L;
}
default boolean isSelector() {
return false;
}
/**
* Simulate this effect's execution and record intended state changes.
* <p>
@@ -348,25 +348,49 @@ public final class WiredEngine {
return;
}
// Determine which effects to execute
// Separate selectors from regular effects.
// Selectors must always run first so ctx.targets() is populated before
// regular effects consume it.
List<IWiredEffect> selectors = new ArrayList<>();
List<IWiredEffect> regulars = new ArrayList<>();
for (IWiredEffect e : effects) {
if (e.isSelector()) selectors.add(e);
else regulars.add(e);
}
// Determine which (regular) effects to execute
List<IWiredEffect> toExecute;
if (stack.useRandom()) {
// Random mode: pick one random effect
int randomIndex = new Random().nextInt(effects.size());
toExecute = Collections.singletonList(effects.get(randomIndex));
debug(ctx.room(), "Random mode: selected effect {}/{}", randomIndex + 1, effects.size());
// Random mode: pick one random regular effect
if (regulars.isEmpty()) {
toExecute = new ArrayList<>();
} else {
int randomIndex = new Random().nextInt(regulars.size());
toExecute = Collections.singletonList(regulars.get(randomIndex));
debug(ctx.room(), "Random mode: selected effect {}/{}", randomIndex + 1, regulars.size());
}
} else if (stack.useUnseen()) {
// Unseen mode: round-robin selection
int index = getNextUnseenIndex(stack, effects.size());
toExecute = Collections.singletonList(effects.get(index));
debug(ctx.room(), "Unseen mode: selected effect {}/{}", index + 1, effects.size());
// Unseen mode: round-robin among regular effects
if (regulars.isEmpty()) {
toExecute = new ArrayList<>();
} else {
int index = getNextUnseenIndex(stack, regulars.size());
toExecute = Collections.singletonList(regulars.get(index));
debug(ctx.room(), "Unseen mode: selected effect {}/{}", index + 1, regulars.size());
}
} else {
// Normal mode: execute all in random order
toExecute = new ArrayList<>(effects);
// Normal mode: regular effects in random order
toExecute = new ArrayList<>(regulars);
Collections.shuffle(toExecute);
}
// Selectors always run first (in their natural tile order), then regular effects
List<IWiredEffect> ordered = new ArrayList<>(selectors.size() + toExecute.size());
ordered.addAll(selectors);
ordered.addAll(toExecute);
toExecute = ordered;
// Execute selected effects
for (IWiredEffect effect : toExecute) {
// Check if effect requires actor