You've already forked Arcturus-Morningstar-Extended
mirror of
https://github.com/duckietm/Arcturus-Morningstar-Extended.git
synced 2026-06-20 15:36:17 +00:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 55b38e7b85 | |||
| 4a96c5baaf | |||
| 539c5b5b96 | |||
| 7b7154e68f | |||
| 4aabb738a3 | |||
| 691dc42627 | |||
| 226873c1fb | |||
| a06a204b39 | |||
| e213609609 | |||
| 44d38b8661 | |||
| ccadb81970 | |||
| 0a3a940946 | |||
| 4613fbe80c |
@@ -1 +1,17 @@
|
|||||||
INSERT INTO `camwijsnew`.`permission_definitions` (`permission_key`, `max_value`, `comment`, `rank_1`, `rank_2`, `rank_3`, `rank_4`, `rank_5`, `rank_6`, `rank_7`) VALUES ('acc_housekeeping', '1', 'Allow housekeeping in the client', '0', '0', '0', '0', '0', '0', '1');
|
INSERT INTO `permission_definitions` (`permission_key`, `max_value`, `comment`, `rank_1`, `rank_2`, `rank_3`, `rank_4`, `rank_5`, `rank_6`, `rank_7`) VALUES ('acc_housekeeping', '1', 'Allow housekeeping in the client', '0', '0', '0', '0', '0', '0', '1');
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `housekeeping_log` (
|
||||||
|
`id` INT NOT NULL AUTO_INCREMENT,
|
||||||
|
`timestamp` INT NOT NULL,
|
||||||
|
`actor_id` INT NOT NULL,
|
||||||
|
`actor_name` VARCHAR(64) NOT NULL DEFAULT '',
|
||||||
|
`target_type` VARCHAR(16) NOT NULL DEFAULT 'user',
|
||||||
|
`target_id` INT NOT NULL DEFAULT 0,
|
||||||
|
`target_label` VARCHAR(128) NOT NULL DEFAULT '',
|
||||||
|
`action` VARCHAR(64) NOT NULL DEFAULT '',
|
||||||
|
`detail` VARCHAR(500) NOT NULL DEFAULT '',
|
||||||
|
`success` TINYINT NOT NULL DEFAULT 1,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
KEY `timestamp` (`timestamp`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
<groupId>com.eu.habbo</groupId>
|
<groupId>com.eu.habbo</groupId>
|
||||||
<artifactId>Habbo</artifactId>
|
<artifactId>Habbo</artifactId>
|
||||||
<version>4.2.18</version>
|
<version>4.2.21</version>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
|||||||
@@ -48,6 +48,12 @@ public class Item implements ISerialize {
|
|||||||
return item.getName().toLowerCase().startsWith("a0 pet");
|
return item.getName().toLowerCase().startsWith("a0 pet");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isBot(Item item) {
|
||||||
|
if (item == null) return false;
|
||||||
|
String name = item.getName();
|
||||||
|
return name != null && (name.startsWith("bot_") || name.startsWith("rentable_bot_"));
|
||||||
|
}
|
||||||
|
|
||||||
public static double getCurrentHeight(HabboItem item) {
|
public static double getCurrentHeight(HabboItem item) {
|
||||||
if (item instanceof InteractionMultiHeight && item.getBaseItem().getMultiHeights().length > 0) {
|
if (item instanceof InteractionMultiHeight && item.getBaseItem().getMultiHeights().length > 0) {
|
||||||
if (item.getExtradata().isEmpty()) {
|
if (item.getExtradata().isEmpty()) {
|
||||||
|
|||||||
+9
@@ -175,6 +175,15 @@ public class CatalogBuyItemAsGiftEvent extends MessageHandler {
|
|||||||
|
|
||||||
CatalogItem item = page.getCatalogItem(itemId);
|
CatalogItem item = page.getCatalogItem(itemId);
|
||||||
|
|
||||||
|
if (item == null) {
|
||||||
|
for (CatalogItem candidate : page.getCatalogItems().valueCollection()) {
|
||||||
|
if (candidate != null && candidate.getOfferId() == itemId) {
|
||||||
|
item = candidate;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (item == null) {
|
if (item == null) {
|
||||||
LOGGER.debug("catalog item null -> {}", itemId);
|
LOGGER.debug("catalog item null -> {}", itemId);
|
||||||
this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR).compose());
|
this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR).compose());
|
||||||
|
|||||||
+29
-11
@@ -5,6 +5,7 @@ import com.eu.habbo.habbohotel.bots.BotManager;
|
|||||||
import com.eu.habbo.habbohotel.catalog.*;
|
import com.eu.habbo.habbohotel.catalog.*;
|
||||||
import com.eu.habbo.habbohotel.catalog.layouts.*;
|
import com.eu.habbo.habbohotel.catalog.layouts.*;
|
||||||
import com.eu.habbo.habbohotel.items.FurnitureType;
|
import com.eu.habbo.habbohotel.items.FurnitureType;
|
||||||
|
import com.eu.habbo.habbohotel.items.Item;
|
||||||
import com.eu.habbo.habbohotel.permissions.Permission;
|
import com.eu.habbo.habbohotel.permissions.Permission;
|
||||||
import com.eu.habbo.habbohotel.pets.PetManager;
|
import com.eu.habbo.habbohotel.pets.PetManager;
|
||||||
import com.eu.habbo.habbohotel.rooms.BuildersClubRoomSupport;
|
import com.eu.habbo.habbohotel.rooms.BuildersClubRoomSupport;
|
||||||
@@ -13,11 +14,7 @@ import com.eu.habbo.habbohotel.users.HabboBadge;
|
|||||||
import com.eu.habbo.habbohotel.users.HabboInventory;
|
import com.eu.habbo.habbohotel.users.HabboInventory;
|
||||||
import com.eu.habbo.habbohotel.users.subscriptions.Subscription;
|
import com.eu.habbo.habbohotel.users.subscriptions.Subscription;
|
||||||
import com.eu.habbo.messages.incoming.MessageHandler;
|
import com.eu.habbo.messages.incoming.MessageHandler;
|
||||||
import com.eu.habbo.messages.outgoing.catalog.AlertPurchaseFailedComposer;
|
import com.eu.habbo.messages.outgoing.catalog.*;
|
||||||
import com.eu.habbo.messages.outgoing.catalog.AlertPurchaseUnavailableComposer;
|
|
||||||
import com.eu.habbo.messages.outgoing.catalog.BuildersClubFurniCountComposer;
|
|
||||||
import com.eu.habbo.messages.outgoing.catalog.BuildersClubSubscriptionStatusComposer;
|
|
||||||
import com.eu.habbo.messages.outgoing.catalog.PurchaseOKComposer;
|
|
||||||
import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertComposer;
|
import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertComposer;
|
||||||
import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertKeys;
|
import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertKeys;
|
||||||
import com.eu.habbo.messages.outgoing.generic.alerts.HotelWillCloseInMinutesComposer;
|
import com.eu.habbo.messages.outgoing.generic.alerts.HotelWillCloseInMinutesComposer;
|
||||||
@@ -201,15 +198,36 @@ public class CatalogBuyItemEvent extends MessageHandler {
|
|||||||
|
|
||||||
else
|
else
|
||||||
item = page.getCatalogItem(itemId);
|
item = page.getCatalogItem(itemId);
|
||||||
// temp patch, can a dev with better knowledge than me look into this asap pls.
|
|
||||||
if (page instanceof BotsLayout) {
|
if (item == null && !(page instanceof RecentPurchasesLayout)) {
|
||||||
if (!this.client.getHabbo().hasPermission(Permission.ACC_UNLIMITED_BOTS) && this.client.getHabbo().getInventory().getBotsComponent().getBots().size() >= BotManager.MAXIMUM_BOT_INVENTORY_SIZE) {
|
for (CatalogItem candidate : page.getCatalogItems().valueCollection()) {
|
||||||
|
if (candidate != null && candidate.getOfferId() == itemId) {
|
||||||
|
item = candidate;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean itemHasBot = false;
|
||||||
|
boolean itemHasPet = false;
|
||||||
|
|
||||||
|
if (item != null) {
|
||||||
|
for (Item baseItem : item.getBaseItems()) {
|
||||||
|
if (baseItem == null) continue;
|
||||||
|
if (Item.isBot(baseItem)) itemHasBot = true;
|
||||||
|
if (Item.isPet(baseItem)) itemHasPet = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemHasBot && !this.client.getHabbo().hasPermission(Permission.ACC_UNLIMITED_BOTS)
|
||||||
|
&& this.client.getHabbo().getInventory().getBotsComponent().getBots().size() >= BotManager.MAXIMUM_BOT_INVENTORY_SIZE) {
|
||||||
this.client.getHabbo().alert(Emulator.getTexts().getValue("error.bots.max.inventory").replace("%amount%", BotManager.MAXIMUM_BOT_INVENTORY_SIZE + ""));
|
this.client.getHabbo().alert(Emulator.getTexts().getValue("error.bots.max.inventory").replace("%amount%", BotManager.MAXIMUM_BOT_INVENTORY_SIZE + ""));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if (page instanceof PetsLayout) {
|
if (itemHasPet) {
|
||||||
if (!this.client.getHabbo().hasPermission(Permission.ACC_UNLIMITED_PETS) && this.client.getHabbo().getInventory().getPetsComponent().getPets().size() >= PetManager.MAXIMUM_PET_INVENTORY_SIZE) {
|
if (!this.client.getHabbo().hasPermission(Permission.ACC_UNLIMITED_PETS)
|
||||||
|
&& this.client.getHabbo().getInventory().getPetsComponent().getPets().size() >= PetManager.MAXIMUM_PET_INVENTORY_SIZE) {
|
||||||
this.client.getHabbo().alert(Emulator.getTexts().getValue("error.pets.max.inventory").replace("%amount%", PetManager.MAXIMUM_PET_INVENTORY_SIZE + ""));
|
this.client.getHabbo().alert(Emulator.getTexts().getValue("error.pets.max.inventory").replace("%amount%", PetManager.MAXIMUM_PET_INVENTORY_SIZE + ""));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
+74
-12
@@ -4,20 +4,20 @@ import com.eu.habbo.Emulator;
|
|||||||
import com.eu.habbo.habbohotel.permissions.Permission;
|
import com.eu.habbo.habbohotel.permissions.Permission;
|
||||||
import com.eu.habbo.habbohotel.rooms.*;
|
import com.eu.habbo.habbohotel.rooms.*;
|
||||||
import com.eu.habbo.habbohotel.users.Habbo;
|
import com.eu.habbo.habbohotel.users.Habbo;
|
||||||
|
import com.eu.habbo.habbohotel.users.HabboItem;
|
||||||
import com.eu.habbo.messages.ServerMessage;
|
import com.eu.habbo.messages.ServerMessage;
|
||||||
import com.eu.habbo.messages.incoming.MessageHandler;
|
import com.eu.habbo.messages.incoming.MessageHandler;
|
||||||
import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertComposer;
|
import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertComposer;
|
||||||
import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertKeys;
|
import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertKeys;
|
||||||
import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer;
|
import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer;
|
||||||
|
import com.eu.habbo.messages.outgoing.inventory.AddHabboItemComposer;
|
||||||
|
import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer;
|
||||||
import com.eu.habbo.messages.outgoing.rooms.ForwardToRoomComposer;
|
import com.eu.habbo.messages.outgoing.rooms.ForwardToRoomComposer;
|
||||||
import gnu.trove.set.hash.THashSet;
|
import gnu.trove.set.hash.THashSet;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.StringJoiner;
|
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
public class FloorPlanEditorSaveEvent extends MessageHandler {
|
public class FloorPlanEditorSaveEvent extends MessageHandler {
|
||||||
@@ -27,7 +27,8 @@ public class FloorPlanEditorSaveEvent extends MessageHandler {
|
|||||||
public static int MAXIMUM_FLOORPLAN_SIZE = 64 * 64;
|
public static int MAXIMUM_FLOORPLAN_SIZE = 64 * 64;
|
||||||
|
|
||||||
private static final int SAVE_COOLDOWN_SECONDS = 3;
|
private static final int SAVE_COOLDOWN_SECONDS = 3;
|
||||||
private static final Pattern ALLOWED_MAP_CHARS = Pattern.compile("[a-qA-Q0-9xX\r]+");
|
private static final int MAX_AUTO_PICKUP_ITEMS = 500;
|
||||||
|
private static final Pattern ALLOWED_MAP_CHARS = Pattern.compile("[a-zA-Z0-9\r]+");
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getRatelimit() {
|
public int getRatelimit() {
|
||||||
@@ -128,6 +129,11 @@ public class FloorPlanEditorSaveEvent extends MessageHandler {
|
|||||||
errors.add("${notification.floorplan_editor.error.message.invalid_walls_fixed_height}");
|
errors.add("${notification.floorplan_editor.error.message.invalid_walls_fixed_height}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean autoPickup = false;
|
||||||
|
if (this.packet.bytesAvailable() >= 1) {
|
||||||
|
autoPickup = this.packet.readBoolean();
|
||||||
|
}
|
||||||
|
|
||||||
if (errors.length() > 0) {
|
if (errors.length() > 0) {
|
||||||
this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FLOORPLAN_EDITOR_ERROR.key, errors.toString()));
|
this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FLOORPLAN_EDITOR_ERROR.key, errors.toString()));
|
||||||
return;
|
return;
|
||||||
@@ -135,6 +141,9 @@ public class FloorPlanEditorSaveEvent extends MessageHandler {
|
|||||||
|
|
||||||
THashSet<RoomTile> locked_tileList = room.getLockedTiles();
|
THashSet<RoomTile> locked_tileList = room.getLockedTiles();
|
||||||
THashSet<RoomTile> new_tileList = new THashSet<>();
|
THashSet<RoomTile> new_tileList = new THashSet<>();
|
||||||
|
THashSet<HabboItem> itemsToPickup = new THashSet<>();
|
||||||
|
int blockedX = -1;
|
||||||
|
int blockedY = -1;
|
||||||
blockingRoomItemScan:
|
blockingRoomItemScan:
|
||||||
for (int y = 0; y < mapRows.length; y++) {
|
for (int y = 0; y < mapRows.length; y++) {
|
||||||
for (int x = 0; x < firstRowSize; x++) {
|
for (int x = 0; x < firstRowSize; x++) {
|
||||||
@@ -145,7 +154,13 @@ public class FloorPlanEditorSaveEvent extends MessageHandler {
|
|||||||
short height;
|
short height;
|
||||||
|
|
||||||
if (square.equalsIgnoreCase("x") && room.getTopItemAt(x, y) != null) {
|
if (square.equalsIgnoreCase("x") && room.getTopItemAt(x, y) != null) {
|
||||||
errors.add("${notification.floorplan_editor.error.message.change_blocked_by_room_item}");
|
if (autoPickup) {
|
||||||
|
THashSet<HabboItem> here = room.getItemsAt(x, y);
|
||||||
|
if (here != null) itemsToPickup.addAll(here);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
blockedX = x;
|
||||||
|
blockedY = y;
|
||||||
break blockingRoomItemScan;
|
break blockingRoomItemScan;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,33 +170,80 @@ public class FloorPlanEditorSaveEvent extends MessageHandler {
|
|||||||
} else if (Emulator.isNumeric(square)) {
|
} else if (Emulator.isNumeric(square)) {
|
||||||
height = Short.parseShort(square);
|
height = Short.parseShort(square);
|
||||||
} else {
|
} else {
|
||||||
int idx = "abcdefghijklmnopq".indexOf(square.toLowerCase());
|
int idx = "abcdefghijklmnopqrstuvwxyz".indexOf(square.toLowerCase());
|
||||||
if (idx < 0) {
|
if (idx < 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
height = (short) (10 + idx);
|
height = (short) Math.min(26, 10 + idx);
|
||||||
}
|
}
|
||||||
} catch (NumberFormatException e) {
|
} catch (NumberFormatException e) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tile != null && tile.state != RoomTileState.INVALID && height != tile.z && room.getTopItemAt(x, y) != null) {
|
if (tile != null && tile.state != RoomTileState.INVALID && height != tile.z && room.getTopItemAt(x, y) != null) {
|
||||||
errors.add("${notification.floorplan_editor.error.message.change_blocked_by_room_item}");
|
if (autoPickup) {
|
||||||
|
THashSet<HabboItem> here = room.getItemsAt(x, y);
|
||||||
|
if (here != null) itemsToPickup.addAll(here);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
blockedX = x;
|
||||||
|
blockedY = y;
|
||||||
break blockingRoomItemScan;
|
break blockingRoomItemScan;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (blockedX < 0) {
|
||||||
locked_tileList.removeAll(new_tileList);
|
locked_tileList.removeAll(new_tileList);
|
||||||
if (!locked_tileList.isEmpty()) {
|
if (!locked_tileList.isEmpty()) {
|
||||||
errors.add("${notification.floorplan_editor.error.message.change_blocked_by_room_item}");
|
if (autoPickup) {
|
||||||
|
for (RoomTile lt : locked_tileList) {
|
||||||
|
THashSet<HabboItem> here = room.getItemsAt(lt.x, lt.y);
|
||||||
|
if (here != null) itemsToPickup.addAll(here);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
RoomTile first = locked_tileList.iterator().next();
|
||||||
|
blockedX = first.x;
|
||||||
|
blockedY = first.y;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (errors.length() > 0) {
|
if (blockedX >= 0) {
|
||||||
this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FLOORPLAN_EDITOR_ERROR.key, errors.toString()));
|
this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FLOORPLAN_EDITOR_ERROR.key,
|
||||||
|
"${notification.floorplan_editor.error.message.change_blocked_by_room_item} (" + blockedX + ", " + blockedY + ")"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (autoPickup && !itemsToPickup.isEmpty()) {
|
||||||
|
if (itemsToPickup.size() > MAX_AUTO_PICKUP_ITEMS) {
|
||||||
|
LOGGER.warn("Floorplan auto-pickup rejected (over cap): user={} room={} itemCount={} cap={}",
|
||||||
|
this.client.getHabbo().getHabboInfo().getId(), room.getId(), itemsToPickup.size(), MAX_AUTO_PICKUP_ITEMS);
|
||||||
|
this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FLOORPLAN_EDITOR_ERROR.key,
|
||||||
|
"Too many items would be picked up (" + itemsToPickup.size() + " > " + MAX_AUTO_PICKUP_ITEMS + "). Remove some furniture manually and save again."));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<Integer, ArrayList<HabboItem>> byOwner = new HashMap<>();
|
||||||
|
for (HabboItem itm : itemsToPickup) {
|
||||||
|
if (itm == null) continue;
|
||||||
|
byOwner.computeIfAbsent(itm.getUserId(), k -> new ArrayList<>()).add(itm);
|
||||||
|
room.pickUpItem(itm, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Map.Entry<Integer, ArrayList<HabboItem>> entry : byOwner.entrySet()) {
|
||||||
|
Habbo owner = Emulator.getGameEnvironment().getHabboManager().getHabbo(entry.getKey());
|
||||||
|
if (owner == null) continue;
|
||||||
|
for (HabboItem itm : entry.getValue()) {
|
||||||
|
owner.getClient().sendResponse(new AddHabboItemComposer(itm));
|
||||||
|
}
|
||||||
|
owner.getClient().sendResponse(new InventoryRefreshComposer());
|
||||||
|
}
|
||||||
|
|
||||||
|
LOGGER.info("Floorplan auto-pickup: user={} room={} itemCount={} owners={}",
|
||||||
|
this.client.getHabbo().getHabboInfo().getId(), room.getId(), itemsToPickup.size(), byOwner.size());
|
||||||
|
}
|
||||||
|
|
||||||
RoomLayout layout = room.getLayout();
|
RoomLayout layout = room.getLayout();
|
||||||
|
|
||||||
if (layout instanceof CustomRoomLayout) {
|
if (layout instanceof CustomRoomLayout) {
|
||||||
|
|||||||
Reference in New Issue
Block a user