From 50c7b1d3f4fa66d8bdfaf1db9d67f5b4a7de5fc9 Mon Sep 17 00:00:00 2001 From: Alejandro <25-alejandro@users.noreply.git.krews.org> Date: Mon, 27 Jan 2020 20:45:44 +0200 Subject: [PATCH] Fix room promotions (closes #337) --- sqlupdates/2_3_0-RC-1_TO_2_3_0-RC-2.sql | 7 +++ .../habbohotel/navigation/EventCategory.java | 43 +++++++++++++++++ .../com/eu/habbo/habbohotel/rooms/Room.java | 16 ++++--- .../habbo/habbohotel/rooms/RoomPromotion.java | 29 ++++++++++-- .../eu/habbo/messages/incoming/Incoming.java | 2 +- .../promotions/BuyRoomPromotionEvent.java | 6 ++- .../eu/habbo/messages/outgoing/Outgoing.java | 3 +- .../NewNavigatorEventCategoriesComposer.java | 47 +++++-------------- .../RoomPromotionMessageComposer.java | 21 +++------ .../com/eu/habbo/plugin/PluginManager.java | 12 ++++- 10 files changed, 124 insertions(+), 62 deletions(-) create mode 100644 src/main/java/com/eu/habbo/habbohotel/navigation/EventCategory.java diff --git a/sqlupdates/2_3_0-RC-1_TO_2_3_0-RC-2.sql b/sqlupdates/2_3_0-RC-1_TO_2_3_0-RC-2.sql index 1b3fbb33..26b22d5d 100644 --- a/sqlupdates/2_3_0-RC-1_TO_2_3_0-RC-2.sql +++ b/sqlupdates/2_3_0-RC-1_TO_2_3_0-RC-2.sql @@ -1,3 +1,10 @@ INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('camera.price.points.publish', '5'); INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('camera.price.points.publish.type', '0'); INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('camera.price.points.type', '0'); + +ALTER TABLE `room_promotions` +ADD COLUMN `start_timestamp` int(11) NOT NULL DEFAULT -1 AFTER `end_timestamp`; +ALTER TABLE `room_promotions` +ADD COLUMN `category` int(11) NOT NULL DEFAULT 0 AFTER `start_timestamp`; + +INSERT INTO `emulator_settings`(`key`, `value`) VALUES ('navigator.eventcategories', '1,Hottest Events,false;2,Parties & Music,true;3,Role Play,true;4,Help Desk,true;5,Trading,true;6,Games,true;7,Debates & Discussions,true;8,Grand Openings,true;9,Friending,true;10,Jobs,true;11,Group Events,true'); \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/navigation/EventCategory.java b/src/main/java/com/eu/habbo/habbohotel/navigation/EventCategory.java new file mode 100644 index 00000000..264c8943 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/navigation/EventCategory.java @@ -0,0 +1,43 @@ +package com.eu.habbo.habbohotel.navigation; + +import com.eu.habbo.messages.ServerMessage; + +public class EventCategory { + private int id; + private String caption; + private boolean visible; + + public EventCategory(int id, String caption, boolean visible) { + this.id = id; + this.caption = caption; + this.visible = visible; + } + + public EventCategory(String serialized) throws Exception { + String[] parts = serialized.split(","); + + if (parts.length != 3) throw new Exception("A serialized event category should contain 3 fields"); + + this.id = Integer.valueOf(parts[0]); + this.caption = parts[1]; + this.visible = parts[2].equalsIgnoreCase("true"); + } + + public int getId() { + return id; + } + + public String getCaption() { + return caption; + } + + public boolean isVisible() { + return visible; + } + + public void serialize(ServerMessage message) { + message.appendInt(this.id); + message.appendString(this.caption); + message.appendBoolean(this.visible); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java b/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java index 276e6d88..708cfa12 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java @@ -2095,25 +2095,29 @@ public class Room implements Comparable, ISerialize, Runnable { return ""; } - public void createPromotion(String title, String description) { + public void createPromotion(String title, String description, int category) { this.promoted = true; if (this.promotion == null) { - this.promotion = new RoomPromotion(this, title, description, Emulator.getIntUnixTimestamp() + (120 * 60)); + this.promotion = new RoomPromotion(this, title, description, Emulator.getIntUnixTimestamp() + (120 * 60), Emulator.getIntUnixTimestamp(), category); } else { this.promotion.setTitle(title); this.promotion.setDescription(description); this.promotion.setEndTimestamp(Emulator.getIntUnixTimestamp() + (120 * 60)); + this.promotion.setCategory(category); } - try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO room_promotions (room_id, title, description, end_timestamp) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE title = ?, description = ?, end_timestamp = ?")) { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO room_promotions (room_id, title, description, end_timestamp, start_timestamp, category) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE title = ?, description = ?, end_timestamp = ?, category = ?")) { statement.setInt(1, this.id); statement.setString(2, title); statement.setString(3, description); statement.setInt(4, this.promotion.getEndTimestamp()); - statement.setString(5, this.promotion.getTitle()); - statement.setString(6, this.promotion.getDescription()); - statement.setInt(7, this.promotion.getEndTimestamp()); + statement.setInt(5, this.promotion.getStartTimestamp()); + statement.setInt(6, category); + statement.setString(7, this.promotion.getTitle()); + statement.setString(8, this.promotion.getDescription()); + statement.setInt(9, this.promotion.getEndTimestamp()); + statement.setInt(10, this.promotion.getCategory()); statement.execute(); } catch (SQLException e) { Emulator.getLogging().logSQLException(e); diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomPromotion.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomPromotion.java index 6aeae74f..fa43278b 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomPromotion.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomPromotion.java @@ -13,12 +13,16 @@ public class RoomPromotion { private String title; private String description; private int endTimestamp; + private int startTimestamp; + private int category; - public RoomPromotion(Room room, String title, String description, int endTimestamp) { + public RoomPromotion(Room room, String title, String description, int endTimestamp, int startTimestamp, int category) { this.room = room; this.title = title; this.description = description; this.endTimestamp = endTimestamp; + this.startTimestamp = startTimestamp; + this.category = category; } public RoomPromotion(Room room, ResultSet set) throws SQLException { @@ -26,14 +30,17 @@ public class RoomPromotion { this.title = set.getString("title"); this.description = set.getString("description"); this.endTimestamp = set.getInt("end_timestamp"); + this.startTimestamp = set.getInt("start_timestamp"); + this.category = set.getInt("category"); } public void save() { if (this.needsUpdate) { - try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE room_promotions SET title = ?, description = ? WHERE room_id = ?")) { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE room_promotions SET title = ?, description = ?, category = ? WHERE room_id = ?")) { statement.setString(1, this.title); statement.setString(2, this.description); - statement.setInt(3, this.room.getId()); + statement.setInt(3, this.category); + statement.setInt(4, this.room.getId()); statement.executeUpdate(); } catch (SQLException e) { Emulator.getLogging().logSQLException(e); @@ -74,4 +81,20 @@ public class RoomPromotion { public void addEndTimestamp(int time) { this.endTimestamp += time; } + + public int getStartTimestamp() { + return startTimestamp; + } + + public void setStartTimestamp(int startTimestamp) { + this.startTimestamp = startTimestamp; + } + + public int getCategory() { + return category; + } + + public void setCategory(int category) { + this.category = category; + } } diff --git a/src/main/java/com/eu/habbo/messages/incoming/Incoming.java b/src/main/java/com/eu/habbo/messages/incoming/Incoming.java index 6b13ed2e..e5cf0ba7 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/Incoming.java +++ b/src/main/java/com/eu/habbo/messages/incoming/Incoming.java @@ -259,6 +259,7 @@ public class Incoming { public static final int RequestDeleteRoomEvent = 532; public static final int RequestPromotionRoomsEvent = 1075; public static final int BuyRoomPromotionEvent = 777; + public static final int EditRoomPromotionMessageEvent = 3991; public static final int RequestGuideToolEvent = 1922; public static final int RequestGuideAssistanceEvent = 3338; public static final int GuideUserTypingEvent = 519; @@ -314,7 +315,6 @@ public class Incoming { public static final int YoutubeRequestStateChange = 3005; public static final int YoutubeRequestPlaylistChange = 2069; - public static final int EditRoomPromotionMessageEvent = 3707; public static final int HotelViewRequestBadgeRewardEvent = 2318; public static final int HotelViewClaimBadgeRewardEvent = -1; diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/promotions/BuyRoomPromotionEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/promotions/BuyRoomPromotionEvent.java index 948d0b08..dc5278c5 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/rooms/promotions/BuyRoomPromotionEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/promotions/BuyRoomPromotionEvent.java @@ -7,6 +7,7 @@ import com.eu.habbo.habbohotel.rooms.Room; import com.eu.habbo.messages.incoming.MessageHandler; import com.eu.habbo.messages.outgoing.catalog.AlertPurchaseFailedComposer; import com.eu.habbo.messages.outgoing.catalog.PurchaseOKComposer; +import com.eu.habbo.messages.outgoing.navigator.NewNavigatorEventCategoriesComposer; import com.eu.habbo.messages.outgoing.rooms.promotions.RoomPromotionMessageComposer; public class BuyRoomPromotionEvent extends MessageHandler { @@ -20,6 +21,9 @@ public class BuyRoomPromotionEvent extends MessageHandler { String description = this.packet.readString(); int categoryId = this.packet.readInt(); + if (NewNavigatorEventCategoriesComposer.CATEGORIES.stream().noneMatch(c -> c.getId() == categoryId)) + return; + CatalogPage page = Emulator.getGameEnvironment().getCatalogManager().getCatalogPage(pageId); if (page != null) { @@ -35,7 +39,7 @@ public class BuyRoomPromotionEvent extends MessageHandler { if (room.isPromoted()) { room.getPromotion().addEndTimestamp(120 * 60); } else { - room.createPromotion(title, description); + room.createPromotion(title, description, categoryId); } if (room.isPromoted()) { diff --git a/src/main/java/com/eu/habbo/messages/outgoing/Outgoing.java b/src/main/java/com/eu/habbo/messages/outgoing/Outgoing.java index 037efc81..b1d7dd27 100644 --- a/src/main/java/com/eu/habbo/messages/outgoing/Outgoing.java +++ b/src/main/java/com/eu/habbo/messages/outgoing/Outgoing.java @@ -388,13 +388,12 @@ public class Outgoing { public final static int AlertPurchaseUnavailableComposer = 3770; // PRODUCTION-201611291003-338511768 public final static int PetBreedingStartFailedComposer = 2621; // PRODUCTION-201611291003-338511768 public final static int DailyQuestComposer = 1878; // PRODUCTION-201611291003-338511768 - public final static int NewNavigatorRoomEventComposer = 1840; // PRODUCTION-201611291003-338511768 public final static int HotelViewHideCommunityVoteButtonComposer = 1435; // PRODUCTION-201611291003-338511768 public final static int CatalogSearchResultComposer = 3388; // PRODUCTION-201611291003-338511768 public final static int FriendFindingRoomComposer = 1210; // PRODUCTION-201611291003-338511768 public final static int QuestComposer = 230; // PRODUCTION-201611291003-338511768 public final static int ModToolSanctionDataComposer = 2782; // PRODUCTION-201611291003-338511768 - public final static int RoomEventMessageComposer = 2274; + public final static int RoomEventMessageComposer = 1840; public final static int JukeBoxMySongsComposer = 2602; // PRODUCTION-201611291003-338511768 diff --git a/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorEventCategoriesComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorEventCategoriesComposer.java index aacf54cb..baff726f 100644 --- a/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorEventCategoriesComposer.java +++ b/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorEventCategoriesComposer.java @@ -1,47 +1,26 @@ package com.eu.habbo.messages.outgoing.navigator; +import com.eu.habbo.habbohotel.navigation.EventCategory; import com.eu.habbo.messages.ServerMessage; import com.eu.habbo.messages.outgoing.MessageComposer; import com.eu.habbo.messages.outgoing.Outgoing; +import java.util.ArrayList; +import java.util.List; + public class NewNavigatorEventCategoriesComposer extends MessageComposer { + public static List CATEGORIES = new ArrayList<>(); + @Override public ServerMessage compose() { this.response.init(Outgoing.NewNavigatorEventCategoriesComposer); - this.response.appendInt(11); - this.response.appendInt(1); - this.response.appendString("Hottest Events"); - this.response.appendBoolean(false); - this.response.appendInt(2); - this.response.appendString("Parties & Music"); - this.response.appendBoolean(true); - this.response.appendInt(3); - this.response.appendString("Role Play"); - this.response.appendBoolean(true); - this.response.appendInt(4); - this.response.appendString("Help Desk"); - this.response.appendBoolean(true); - this.response.appendInt(5); - this.response.appendString("Trading"); - this.response.appendBoolean(true); - this.response.appendInt(6); - this.response.appendString("Games"); - this.response.appendBoolean(true); - this.response.appendInt(7); - this.response.appendString("Debates & Discussions"); - this.response.appendBoolean(true); - this.response.appendInt(8); - this.response.appendString("Grand Openings"); - this.response.appendBoolean(true); - this.response.appendInt(9); - this.response.appendString("Friending"); - this.response.appendBoolean(true); - this.response.appendInt(10); - this.response.appendString("Jobs"); - this.response.appendBoolean(true); - this.response.appendInt(11); - this.response.appendString("Group Events"); - this.response.appendBoolean(true); + + this.response.appendInt(NewNavigatorEventCategoriesComposer.CATEGORIES.size()); + + for (EventCategory category : NewNavigatorEventCategoriesComposer.CATEGORIES) { + category.serialize(this.response); + } + return this.response; } } diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/promotions/RoomPromotionMessageComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/promotions/RoomPromotionMessageComposer.java index e82a8055..12403e90 100644 --- a/src/main/java/com/eu/habbo/messages/outgoing/rooms/promotions/RoomPromotionMessageComposer.java +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/promotions/RoomPromotionMessageComposer.java @@ -1,5 +1,6 @@ package com.eu.habbo.messages.outgoing.rooms.promotions; +import com.eu.habbo.Emulator; import com.eu.habbo.habbohotel.rooms.Room; import com.eu.habbo.habbohotel.rooms.RoomPromotion; import com.eu.habbo.messages.ServerMessage; @@ -21,37 +22,29 @@ public class RoomPromotionMessageComposer extends MessageComposer { this.response.init(Outgoing.RoomEventMessageComposer); if (this.room == null || this.roomPromotion == null) { - this.response.appendInt(-1); - this.response.appendInt(-1); - this.response.appendString(""); - this.response.appendInt(0); this.response.appendInt(0); - this.response.appendString(""); - this.response.appendString(""); - this.response.appendInt(0); - this.response.appendInt(0); this.response.appendInt(0); } else { - this.response.appendInt(this.room.getId()); + this.response.appendInt(this.room.getId()); // promotion id this.response.appendInt(this.room.getOwnerId()); this.response.appendString(this.room.getOwnerName()); - this.response.appendInt(1); - this.response.appendInt(1); + this.response.appendInt(this.room.getId()); // room id + this.response.appendInt(1); // "type" this.response.appendString(this.roomPromotion.getTitle()); this.response.appendString(this.roomPromotion.getDescription()); - this.response.appendInt(0); - this.response.appendInt(0); - this.response.appendInt(0); + this.response.appendInt((Emulator.getIntUnixTimestamp() - this.roomPromotion.getStartTimestamp()) / 60); // minutes since starting + this.response.appendInt((this.roomPromotion.getEndTimestamp() - Emulator.getIntUnixTimestamp()) / 60); // minutes until end + this.response.appendInt(this.roomPromotion.getCategory()); // category } return this.response; diff --git a/src/main/java/com/eu/habbo/plugin/PluginManager.java b/src/main/java/com/eu/habbo/plugin/PluginManager.java index 306fc1ff..92c636d2 100644 --- a/src/main/java/com/eu/habbo/plugin/PluginManager.java +++ b/src/main/java/com/eu/habbo/plugin/PluginManager.java @@ -15,6 +15,7 @@ import com.eu.habbo.habbohotel.items.interactions.InteractionRoller; import com.eu.habbo.habbohotel.items.interactions.games.football.InteractionFootballGate; import com.eu.habbo.habbohotel.messenger.Messenger; import com.eu.habbo.habbohotel.modtool.WordFilter; +import com.eu.habbo.habbohotel.navigation.EventCategory; import com.eu.habbo.habbohotel.navigation.NavigatorManager; import com.eu.habbo.habbohotel.rooms.*; import com.eu.habbo.habbohotel.users.HabboInventory; @@ -28,6 +29,7 @@ import com.eu.habbo.messages.incoming.floorplaneditor.FloorPlanEditorSaveEvent; import com.eu.habbo.messages.incoming.hotelview.HotelViewRequestLTDAvailabilityEvent; import com.eu.habbo.messages.incoming.users.ChangeNameCheckUsernameEvent; import com.eu.habbo.messages.outgoing.catalog.DiscountComposer; +import com.eu.habbo.messages.outgoing.navigator.NewNavigatorEventCategoriesComposer; import com.eu.habbo.plugin.events.emulator.EmulatorConfigUpdatedEvent; import com.eu.habbo.plugin.events.emulator.EmulatorLoadedEvent; import com.eu.habbo.plugin.events.roomunit.RoomUnitLookAtPointEvent; @@ -132,12 +134,20 @@ public class PluginManager { CameraPurchaseEvent.CAMERA_PURCHASE_POINTS = Emulator.getConfig().getInt("camera.price.points", 5); CameraPurchaseEvent.CAMERA_PURCHASE_POINTS_TYPE = Emulator.getConfig().getInt("camera.price.points.type", 0); + NewNavigatorEventCategoriesComposer.CATEGORIES.clear(); + for (String category : Emulator.getConfig().getValue("navigator.eventcategories", "").split(";")) { + try { + NewNavigatorEventCategoriesComposer.CATEGORIES.add(new EventCategory(category)); + } catch (Exception e) { + e.printStackTrace(); + } + } + if (Emulator.isReady) { Emulator.getGameEnvironment().getCreditsScheduler().reloadConfig(); Emulator.getGameEnvironment().getPointsScheduler().reloadConfig(); Emulator.getGameEnvironment().getPixelScheduler().reloadConfig(); Emulator.getGameEnvironment().getGotwPointsScheduler().reloadConfig(); - } }