Merge branch 'dev' into 'master'

2-3-0

Closes #480, #351, #352, #349, #339, #340, #331, #333, #328, #337, #338, #327, #336, #335, #326, #320, #305, #302, #308, #309, #310, #312, #314, #315, #313, and #107

See merge request morningstar/Arcturus-Community!107
This commit is contained in:
Harmonic 2020-03-13 15:41:05 -04:00
commit 0782929e72
171 changed files with 2720 additions and 1066 deletions

15
.gitlab-ci.yml Normal file
View File

@ -0,0 +1,15 @@
image: maven:latest
cache:
paths:
- target/
build:
script:
- mvn package
only:
- dev
- master
artifacts:
paths:
- target/Habbo-*.jar

View File

@ -11,8 +11,8 @@ TheGeneral's own words were "dont like it then dont use it". We did not like wha
Arcturus Morningstar is released under the [GNU General Public License v3](https://www.gnu.org/licenses/gpl-3.0.txt). Arcturus Morningstar is released under the [GNU General Public License v3](https://www.gnu.org/licenses/gpl-3.0.txt).
## Versions ## ## Versions ##
![image](https://img.shields.io/badge/VERSION-2.2.2-success.svg?style=for-the-badge&logo=appveyor) ![image](https://img.shields.io/badge/VERSION-2.3.0-success.svg?style=for-the-badge&logo=appveyor)
![image](https://img.shields.io/badge/STATUS-STABLE-blue.svg?style=for-the-badge&logo=appveyor) ![image](https://img.shields.io/badge/STATUS-UNSTABLE-red.svg?style=for-the-badge&logo=appveyor)
Compiled Download: https://git.krews.org/morningstar/Arcturus-Community/releases Compiled Download: https://git.krews.org/morningstar/Arcturus-Community/releases
@ -32,8 +32,7 @@ When making an bug report or a feature request use the template we provide so th
- Harmony - Harmony
- Quadral (Pathfinder) - Quadral (Pathfinder)
- Skeletor - Skeletor
- Arpyage - z
- ItsGiuseppe
## Discord ## ## Discord ##
Join us on Discord at https://discord.gg/BzfFsTp Join us on Discord at https://discord.gg/BzfFsTp

24
pom.xml
View File

@ -6,7 +6,7 @@
<groupId>com.eu.habbo</groupId> <groupId>com.eu.habbo</groupId>
<artifactId>Habbo</artifactId> <artifactId>Habbo</artifactId>
<version>2.2.2</version> <version>2.3.0</version>
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@ -79,7 +79,11 @@
<repositories> <repositories>
<repository> <repository>
<id>central</id> <id>central</id>
<url>http://repo1.maven.org/maven2/</url> <url>https://repo1.maven.org/maven2/</url>
</repository>
<repository>
<id>mvnrepo</id>
<url>https://mvnrepository.com/</url>
</repository> </repository>
</repositories> </repositories>
@ -91,6 +95,14 @@
<version>4.1.36.Final</version> <version>4.1.36.Final</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/org.fusesource.jansi/jansi -->
<dependency>
<groupId>org.fusesource.jansi</groupId>
<artifactId>jansi</artifactId>
<version>1.18</version>
</dependency>
<dependency> <dependency>
<groupId>io.netty</groupId> <groupId>io.netty</groupId>
<artifactId>netty-codec-http</artifactId> <artifactId>netty-codec-http</artifactId>
@ -182,4 +194,12 @@
</dependency> </dependency>
</dependencies> </dependencies>
<distributionManagement>
<repository>
<id>internal.repo</id>
<name>Internal repo</name>
<url>file:///home/thara/testesb/in</url>
</repository>
</distributionManagement>
</project> </project>

View File

@ -0,0 +1,32 @@
CREATE TABLE `sanctions` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`habbo_id` int(11) NOT NULL DEFAULT '0',
`sanction_level` int(11) NOT NULL DEFAULT '0',
`probation_timestamp` int(32) NOT NULL DEFAULT '0',
`reason` varchar(255) NOT NULL DEFAULT '',
`trade_locked_until` int(32) NOT NULL DEFAULT '0',
`is_muted` tinyint(1) NOT NULL DEFAULT '0',
`mute_duration` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `sanction_levels` (
`level` int(1) NOT NULL,
`type` enum('ALERT', 'BAN', 'MUTE') NOT NULL,
`hour_length` int(12) NOT NULL,
`probation_days` int(12) NOT NULL,
PRIMARY KEY (`level`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ALTER TABLE `sanction_levels`
ADD CONSTRAINT `level` CHECK (`level`<=7);
INSERT INTO `sanction_levels` VALUES (1, 'ALERT', 0, 30);
INSERT INTO `sanction_levels` VALUES (2, 'MUTE', 1, 30);
INSERT INTO `sanction_levels` VALUES (3, 'BAN', 18, 30);
INSERT INTO `sanction_levels` VALUES (4, 'BAN', 168, 30);
INSERT INTO `sanction_levels` VALUES (5, 'BAN', 720, 60);
INSERT INTO `sanction_levels` VALUES (6, 'BAN', 720, 60);
INSERT INTO `sanction_levels` VALUES (7, 'BAN', 876581, 876581);
INSERT INTO `emulator_settings`(`key`, `value`) VALUES ('hotel.sanctions.enabled', '1');

View File

@ -0,0 +1,23 @@
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');
INSERT INTO `emulator_settings`(`key`, `value`) VALUES ('room.promotion.badge', 'RADZZ');
CREATE TABLE `guild_forum_views` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`guild_id` int(11) NOT NULL,
`timestamp` int(11) NOT NULL,
PRIMARY KEY (`id`)
);
ALTER TABLE `support_tickets`
ADD COLUMN `photo_item_id` int(11) NOT NULL DEFAULT -1 AFTER `comment_id`;

View File

@ -0,0 +1,7 @@
ALTER TABLE `users_pets`
ADD COLUMN `saddle_item_id` int(11) NULL;
INSERT INTO `emulator_settings`(`key`, `value`) VALUES ('hotel.bot.placement.messages', 'Yo!;Hello I\'m a real party animal!;Hello!');
UPDATE `items_base` SET `customparams` = '1,true' WHERE `item_name` = 'wf_blob';
UPDATE `items_base` SET `customparams` = '5,false' WHERE `item_name` = 'wf_blob2';

View File

@ -0,0 +1,7 @@
ALTER TABLE `users_pets`
ADD COLUMN `saddle_item_id` int(11) NULL;
INSERT INTO `emulator_settings`(`key`, `value`) VALUES ('hotel.bot.placement.messages', 'Yo!;Hello I\'m a real party animal!;Hello!');
UPDATE `items_base` SET `customparams` = '1,true' WHERE `item_name` = 'wf_blob';
UPDATE `items_base` SET `customparams` = '5,false' WHERE `item_name` = 'wf_blob2';

View File

@ -0,0 +1,2 @@
INSERT INTO `emulator_texts`(`key`, `value`) VALUES ('commands.generic.cmd_commands.text', 'Your Commands');
INSERT INTO `emulator_texts`(`key`, `value`) VALUES ('commands.keys.cmd_stand', 'stand');

View File

@ -17,6 +17,7 @@ import com.eu.habbo.plugin.events.emulator.EmulatorStartShutdownEvent;
import com.eu.habbo.plugin.events.emulator.EmulatorStoppedEvent; import com.eu.habbo.plugin.events.emulator.EmulatorStoppedEvent;
import com.eu.habbo.threading.ThreadPooling; import com.eu.habbo.threading.ThreadPooling;
import com.eu.habbo.util.imager.badges.BadgeImager; import com.eu.habbo.util.imager.badges.BadgeImager;
import org.fusesource.jansi.AnsiConsole;
import java.io.*; import java.io.*;
import java.security.MessageDigest; import java.security.MessageDigest;
@ -28,32 +29,37 @@ import java.util.Random;
public final class Emulator { public final class Emulator {
public final static int MAJOR = 2; public final static int MAJOR = 2;
public final static int MINOR = 3;
public final static int BUILD = 0;
public static final String ANSI_RED = "\u001B[31m";
public static final String ANSI_BLUE = "\u001B[34m";
public static final String ANSI_PURPLE = "\u001B[35m";
public static final String ANSI_WHITE = "\u001B[37m";
public static final String ANSI_YELLOW = "\u001B[33m";
public final static int MINOR = 2; public final static String PREVIEW = "RC-3";
public final static int BUILD = 2;
public final static String PREVIEW = "Stable";
public static final String version = "Arcturus Morningstar" + " " + MAJOR + "." + MINOR + "." + BUILD + " " + PREVIEW; public static final String version = "Arcturus Morningstar" + " " + MAJOR + "." + MINOR + "." + BUILD + " " + PREVIEW;
private static final String logo = private static final String logo =
"\n" + "\n" +
" __ ___ _ A R C T U R U S __ \n" + "███╗ ███╗ ██████╗ ██████╗ ███╗ ██╗██╗███╗ ██╗ ██████╗ ███████╗████████╗ █████╗ ██████╗ \n" +
" / |/ /___ _________ (_)___ ____ ______/ /_____ ______ \n" + "████╗ ████║██╔═══██╗██╔══██╗████╗ ██║██║████╗ ██║██╔════╝ ██╔════╝╚══██╔══╝██╔══██╗██╔══██╗\n" +
" / /|_/ / __ \\/ ___/ __ \\/ / __ \\/ __ `/ ___/ __/ __ `/ ___/ \n" + "██╔████╔██║██║ ██║██████╔╝██╔██╗ ██║██║██╔██╗ ██║██║ ███╗███████╗ ██║ ███████║██████╔╝\n" +
" / / / / /_/ / / / / / / / / / / /_/ (__ ) /_/ /_/ / / \n" + "██║╚██╔╝██║██║ ██║██╔══██╗██║╚██╗██║██║██║╚██╗██║██║ ██║╚════██║ ██║ ██╔══██║██╔══██╗\n" +
"/_/ /_/\\____/_/ /_/ /_/_/_/ /_/\\__, /____/\\__/\\__,_/_/ \n" + "██║ ╚═╝ ██║╚██████╔╝██║ ██║██║ ╚████║██║██║ ╚████║╚██████╔╝███████║ ██║ ██║ ██║██║ ██║\n" +
" /____/ \n" ; "╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝\n" +
" ";
public static String build = ""; public static String build = "";
public static boolean isReady = false; public static boolean isReady = false;
public static boolean isShuttingDown = false; public static boolean isShuttingDown = false;
public static boolean stopped = false; public static boolean stopped = false;
public static boolean debugging = false; public static boolean debugging = false;
private static String classPath = System.getProperty("java.class.path");
private static String osName = System.getProperty("os.name");
private static int timeStarted = 0; private static int timeStarted = 0;
private static Runtime runtime; private static Runtime runtime;
private static ConfigurationManager config; private static ConfigurationManager config;
@ -81,14 +87,20 @@ public final class Emulator {
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
try { try {
if (osName.startsWith("Windows") && (!classPath.contains("idea_rt.jar"))) {
AnsiConsole.systemInstall();
}
Locale.setDefault(new Locale("en")); Locale.setDefault(new Locale("en"));
setBuild(); setBuild();
Emulator.stopped = false; Emulator.stopped = false;
ConsoleCommand.load(); ConsoleCommand.load();
Emulator.logging = new Logging(); Emulator.logging = new Logging();
Emulator.getLogging().logStart("\r" + Emulator.logo + System.out.println(ANSI_PURPLE + logo );
" Build: " + build + "\n"); System.out.println(ANSI_WHITE + "This project is for educational purposes only. This Emulator is an open-source fork of Arcturus created by TheGeneral.");
System.out.println(ANSI_BLUE + "[VERSION] " + ANSI_WHITE + version);
System.out.println(ANSI_RED + "[BUILD] " + ANSI_WHITE + build + "\n");
System.out.println(ANSI_YELLOW + "[KREWS] " + ANSI_WHITE + "Remember to sign up your hotel to join our toplist beta at https://bit.ly/2NN0rxq" );
System.out.println(ANSI_YELLOW + "[KREWS] " + ANSI_WHITE + "Join our discord at https://discord.gg/syuqgN" + "\n");
random = new Random(); random = new Random();
long startTime = System.nanoTime(); long startTime = System.nanoTime();
@ -119,7 +131,6 @@ public final class Emulator {
Emulator.getLogging().logStart("Memory: " + (runtime.totalMemory() - runtime.freeMemory()) / (1024 * 1024) + "/" + (runtime.freeMemory()) / (1024 * 1024) + "MB"); Emulator.getLogging().logStart("Memory: " + (runtime.totalMemory() - runtime.freeMemory()) / (1024 * 1024) + "/" + (runtime.freeMemory()) / (1024 * 1024) + "MB");
Emulator.debugging = Emulator.getConfig().getBoolean("debug.mode"); Emulator.debugging = Emulator.getConfig().getBoolean("debug.mode");
if (debugging) { if (debugging) {
Emulator.getLogging().logDebugLine("Debugging Enabled!"); Emulator.getLogging().logDebugLine("Debugging Enabled!");
} }
@ -134,10 +145,6 @@ public final class Emulator {
Emulator.getThreading().run(() -> { Emulator.getThreading().run(() -> {
Emulator.getLogging().logStart("Please note, Arcturus Emulator is a project by TheGeneral, we take no credit for the original work, and only the work we have continued. If you'd like to support the project, join our discord at: ");
Emulator.getLogging().logStart("https://discord.gg/syuqgN");
Emulator.getLogging().logStart("Please report bugs on our git at Krews.org.");
System.out.println("Waiting for commands: ");
}, 1500); }, 1500);
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
@ -189,11 +196,11 @@ public final class Emulator {
} }
private static void dispose() { private static void dispose() {
Emulator.getThreading().setCanAdd(false); Emulator.getThreading().setCanAdd(false);
Emulator.isShuttingDown = true; Emulator.isShuttingDown = true;
Emulator.isReady = false; Emulator.isReady = false;
Emulator.getLogging().logShutdownLine("Stopping Arcturus Emulator " + version + "..."); Emulator.getLogging().logShutdownLine("Stopping Arcturus Emulator " + version + "...");
try { try {
if (Emulator.getPluginManager() != null) if (Emulator.getPluginManager() != null)
Emulator.getPluginManager().fireEvent(new EmulatorStartShutdownEvent()); Emulator.getPluginManager().fireEvent(new EmulatorStartShutdownEvent());
@ -245,7 +252,6 @@ public final class Emulator {
Emulator.gameServer.stop(); Emulator.gameServer.stop();
} catch (Exception e) { } catch (Exception e) {
} }
Emulator.getLogging().logShutdownLine("Stopped Arcturus Emulator " + version + "..."); Emulator.getLogging().logShutdownLine("Stopped Arcturus Emulator " + version + "...");
if (Emulator.database != null) { if (Emulator.database != null) {
@ -253,8 +259,12 @@ public final class Emulator {
} }
Emulator.stopped = true; Emulator.stopped = true;
if (osName.startsWith("Windows") && (!classPath.contains("idea_rt.jar"))) {
AnsiConsole.systemUninstall();
}
try { try {
if (Emulator.threading != null) if (Emulator.threading != null)
Emulator.threading.shutDown(); Emulator.threading.shutDown();
} catch (Exception e) { } catch (Exception e) {
} }

View File

@ -134,7 +134,7 @@ public class Logging {
if (Emulator.getConfig().getBoolean("logging.debug")) { if (Emulator.getConfig().getBoolean("logging.debug")) {
this.write(debugFileWriter, line.toString()); this.write(debugFileWriter, line.toString());
} }
System.out.println("[" + Logging.ANSI_BRIGHT + Logging.ANSI_GREEN + "SHUTDOWN" + Logging.ANSI_RESET + "] " + line.toString()); System.out.println("[" + Logging.ANSI_BRIGHT + Logging.ANSI_RED + "SHUTDOWN" + Logging.ANSI_RESET + "] " + line.toString());
} }
public void logUserLine(Object line) { public void logUserLine(Object line) {

View File

@ -15,6 +15,7 @@ import com.eu.habbo.habbohotel.guilds.GuildManager;
import com.eu.habbo.habbohotel.hotelview.HotelViewManager; import com.eu.habbo.habbohotel.hotelview.HotelViewManager;
import com.eu.habbo.habbohotel.items.ItemManager; import com.eu.habbo.habbohotel.items.ItemManager;
import com.eu.habbo.habbohotel.modtool.ModToolManager; import com.eu.habbo.habbohotel.modtool.ModToolManager;
import com.eu.habbo.habbohotel.modtool.ModToolSanctions;
import com.eu.habbo.habbohotel.modtool.WordFilter; import com.eu.habbo.habbohotel.modtool.WordFilter;
import com.eu.habbo.habbohotel.navigation.NavigatorManager; import com.eu.habbo.habbohotel.navigation.NavigatorManager;
import com.eu.habbo.habbohotel.permissions.PermissionsManager; import com.eu.habbo.habbohotel.permissions.PermissionsManager;
@ -39,6 +40,7 @@ public class GameEnvironment {
private PermissionsManager permissionsManager; private PermissionsManager permissionsManager;
private BotManager botManager; private BotManager botManager;
private ModToolManager modToolManager; private ModToolManager modToolManager;
private ModToolSanctions modToolSanctions;
private PetManager petManager; private PetManager petManager;
private AchievementManager achievementManager; private AchievementManager achievementManager;
private GuideManager guideManager; private GuideManager guideManager;
@ -62,6 +64,7 @@ public class GameEnvironment {
this.navigatorManager = new NavigatorManager(); this.navigatorManager = new NavigatorManager();
this.commandHandler = new CommandHandler(); this.commandHandler = new CommandHandler();
this.modToolManager = new ModToolManager(); this.modToolManager = new ModToolManager();
this.modToolSanctions = new ModToolSanctions();
this.achievementManager = new AchievementManager(); this.achievementManager = new AchievementManager();
this.achievementManager.reload(); this.achievementManager.reload();
this.guideManager = new GuideManager(); this.guideManager = new GuideManager();
@ -145,6 +148,10 @@ public class GameEnvironment {
return this.modToolManager; return this.modToolManager;
} }
public ModToolSanctions getModToolSanctions() {
return this.modToolSanctions;
}
public PetManager getPetManager() { public PetManager getPetManager() {
return this.petManager; return this.petManager;
} }

View File

@ -22,6 +22,8 @@ import java.util.Arrays;
public class Bot implements Runnable { public class Bot implements Runnable {
public static final String NO_CHAT_SET = "${bot.skill.chatter.configuration.text.placeholder}"; public static final String NO_CHAT_SET = "${bot.skill.chatter.configuration.text.placeholder}";
public static String[] PLACEMENT_MESSAGES = "Yo!;Hello I'm a real party animal!;Hello!".split(";");
private final ArrayList<String> chatLines; private final ArrayList<String> chatLines;
private transient int id; private transient int id;
private String name; private String name;
@ -240,6 +242,8 @@ public class Bot implements Runnable {
if (this.roomUnit != null) { if (this.roomUnit != null) {
room.giveEffect(this.roomUnit, this.effect, -1); room.giveEffect(this.roomUnit, this.effect, -1);
} }
this.talk(PLACEMENT_MESSAGES[Emulator.getRandom().nextInt(PLACEMENT_MESSAGES.length)]);
} }
public void onPickUp(Habbo habbo, Room room) { public void onPickUp(Habbo habbo, Room room) {

View File

@ -113,15 +113,19 @@ public class BotManager {
return; return;
} }
if (!room.hasHabbosAt(location.x, location.y) && !location.isWalkable() && location.state != RoomTileState.SIT) if (room.hasHabbosAt(location.x, location.y) || (!location.isWalkable() && location.state != RoomTileState.SIT && location.state != RoomTileState.LAY))
return; return;
RoomUnit roomUnit = new RoomUnit(); RoomUnit roomUnit = new RoomUnit();
roomUnit.setRotation(RoomUserRotation.SOUTH); roomUnit.setRotation(RoomUserRotation.SOUTH);
roomUnit.setLocation(location); roomUnit.setLocation(location);
HabboItem topItem = room.getTopItemAt(location.x, location.y); HabboItem topItem = room.getTopItemAt(location.x, location.y);
roomUnit.setZ(roomUnit.getCurrentLocation().getStackHeight());
roomUnit.setPreviousLocationZ(roomUnit.getCurrentLocation().getStackHeight()); double topItemHeight = 0;
if (topItem != null) topItemHeight = Item.getCurrentHeight(topItem);
roomUnit.setPreviousLocationZ(roomUnit.getCurrentLocation().getStackHeight() - topItemHeight);
roomUnit.setPathFinderRoom(room); roomUnit.setPathFinderRoom(room);
roomUnit.setRoomUnitType(RoomUnitType.BOT); roomUnit.setRoomUnitType(RoomUnitType.BOT);
roomUnit.setCanWalk(room.isAllowBotsWalk()); roomUnit.setCanWalk(room.isAllowBotsWalk());
@ -136,7 +140,6 @@ public class BotManager {
bot.onPlace(habbo, room); bot.onPlace(habbo, room);
if (topItem != null) { if (topItem != null) {
roomUnit.setZ(topItem.getBaseItem().allowSit() ? topItem.getZ() : topItem.getZ() + Item.getCurrentHeight(topItem));
try { try {
topItem.onWalkOn(bot.getRoomUnit(), room, null); topItem.onWalkOn(bot.getRoomUnit(), room, null);
} catch (Exception e) { } catch (Exception e) {

View File

@ -40,6 +40,7 @@ import gnu.trove.map.hash.TIntObjectHashMap;
import gnu.trove.procedure.TObjectProcedure; import gnu.trove.procedure.TObjectProcedure;
import gnu.trove.set.hash.THashSet; import gnu.trove.set.hash.THashSet;
import java.lang.reflect.InvocationTargetException;
import java.sql.*; import java.sql.*;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -729,6 +730,8 @@ public class CatalogManager {
if (pageClazz != null) { if (pageClazz != null) {
try { try {
catalogPage = pageClazz.getConstructor(ResultSet.class).newInstance(page); catalogPage = pageClazz.getConstructor(ResultSet.class).newInstance(page);
} catch (InvocationTargetException e) {
Emulator.getLogging().logErrorLine(e.getCause());
} catch (Exception e) { } catch (Exception e) {
Emulator.getLogging().logErrorLine(e); Emulator.getLogging().logErrorLine(e);
} }

View File

@ -171,7 +171,7 @@ public class MarketPlace {
public static void serializeItemInfo(int itemId, ServerMessage message) { public static void serializeItemInfo(int itemId, ServerMessage message) {
try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT avg(price) as price, COUNT(*) as sold, (datediff(NOW(), DATE(from_unixtime(timestamp)))) as day FROM marketplace_items INNER JOIN items ON items.id = marketplace_items.item_id INNER JOIN items_base ON items.item_id = items_base.id WHERE items.limited_data = '0:0' AND state = 2 AND items_base.sprite_id = ? AND DATE(from_unixtime(timestamp)) >= NOW() - INTERVAL 30 DAY GROUP BY DATE(from_unixtime(timestamp))")) { try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT avg(marketplace_items.price) as price, COUNT(*) as sold, (datediff(NOW(), DATE(from_unixtime(marketplace_items.timestamp)))) as day FROM marketplace_items INNER JOIN items ON items.id = marketplace_items.item_id INNER JOIN items_base ON items.item_id = items_base.id WHERE items.limited_data = '0:0' AND marketplace_items.state = 2 AND items_base.sprite_id = ? AND DATE(from_unixtime(marketplace_items.timestamp)) >= NOW() - INTERVAL 30 DAY GROUP BY DATE(from_unixtime(marketplace_items.timestamp))")) {
statement.setInt(1, itemId); statement.setInt(1, itemId);
message.appendInt(avarageLastXDays(itemId, 7)); message.appendInt(avarageLastXDays(itemId, 7));

View File

@ -245,6 +245,7 @@ public class CommandHandler {
addCommand(new ShoutCommand()); addCommand(new ShoutCommand());
addCommand(new ShutdownCommand()); addCommand(new ShutdownCommand());
addCommand(new SitCommand()); addCommand(new SitCommand());
addCommand(new StandCommand());
addCommand(new SitDownCommand()); addCommand(new SitDownCommand());
addCommand(new StaffAlertCommand()); addCommand(new StaffAlertCommand());
addCommand(new StaffOnlineCommand()); addCommand(new StaffOnlineCommand());

View File

@ -12,7 +12,7 @@ public class CommandsCommand extends Command {
@Override @Override
public boolean handle(GameClient gameClient, String[] params) throws Exception { public boolean handle(GameClient gameClient, String[] params) throws Exception {
StringBuilder message = new StringBuilder("Your Commands"); StringBuilder message = new StringBuilder(Emulator.getTexts().getValue("commands.generic.cmd_commands.text"));
List<Command> commands = Emulator.getGameEnvironment().getCommandHandler().getCommandsForRank(gameClient.getHabbo().getHabboInfo().getRank().getId()); List<Command> commands = Emulator.getGameEnvironment().getCommandHandler().getCommandsForRank(gameClient.getHabbo().getHabboInfo().getRank().getId());
message.append("(").append(commands.size()).append("):\r\n"); message.append("(").append(commands.size()).append("):\r\n");

View File

@ -43,7 +43,7 @@ public class MuteCommand extends Command {
} }
} }
habbo.mute(duration); habbo.mute(duration, false);
if (habbo.getHabboInfo().getCurrentRoom() != null) { if (habbo.getHabboInfo().getCurrentRoom() != null) {
habbo.getHabboInfo().getCurrentRoom().sendComposer(new RoomUserIgnoredComposer(habbo, RoomUserIgnoredComposer.MUTED).compose()); //: RoomUserIgnoredComposer.UNIGNORED habbo.getHabboInfo().getCurrentRoom().sendComposer(new RoomUserIgnoredComposer(habbo, RoomUserIgnoredComposer.MUTED).compose()); //: RoomUserIgnoredComposer.UNIGNORED

View File

@ -9,7 +9,7 @@ import java.util.Collections;
public class PluginsCommand extends Command { public class PluginsCommand extends Command {
public PluginsCommand() { public PluginsCommand() {
super("cmd_plugins", Emulator.getTexts().getValue("commands.keys.cmd_plugins").split(";")); super(null, Emulator.getTexts().getValue("commands.keys.cmd_plugins").split(";"));
} }
@Override @Override

View File

@ -0,0 +1,18 @@
package com.eu.habbo.habbohotel.commands;
import com.eu.habbo.Emulator;
import com.eu.habbo.habbohotel.gameclients.GameClient;
public class StandCommand extends Command {
public StandCommand() {
super(null, Emulator.getTexts().getValue("commands.keys.cmd_stand").split(";"));
}
@Override
public boolean handle(GameClient gameClient, String[] params) throws Exception {
if (gameClient.getHabbo().getHabboInfo().getRiding() == null)
gameClient.getHabbo().getHabboInfo().getCurrentRoom().makeStand(gameClient.getHabbo());
return true;
}
}

View File

@ -5,6 +5,7 @@ import com.eu.habbo.core.Logging;
import com.eu.habbo.habbohotel.users.Habbo; import com.eu.habbo.habbohotel.users.Habbo;
import com.eu.habbo.messages.PacketManager; import com.eu.habbo.messages.PacketManager;
import com.eu.habbo.messages.ServerMessage; import com.eu.habbo.messages.ServerMessage;
import com.eu.habbo.messages.incoming.MessageHandler;
import com.eu.habbo.messages.outgoing.MessageComposer; import com.eu.habbo.messages.outgoing.MessageComposer;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled; import io.netty.buffer.Unpooled;
@ -17,12 +18,12 @@ import java.util.ArrayList;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
public class GameClient { public class GameClient {
public final ConcurrentHashMap<Integer, Integer> incomingPacketCounter = new ConcurrentHashMap<>(25); public final ConcurrentHashMap<Integer, Integer> incomingPacketCounter = new ConcurrentHashMap<>(25);
private final Channel channel; private final Channel channel;
public long lastPacketCounterCleared = Emulator.getIntUnixTimestamp(); public long lastPacketCounterCleared = Emulator.getIntUnixTimestamp();
private Habbo habbo; private Habbo habbo;
private String machineId = ""; private String machineId = "";
public final ConcurrentHashMap<Class<? extends MessageHandler>, Long> messageTimestamps = new ConcurrentHashMap<>();
public GameClient(Channel channel) { public GameClient(Channel channel) {
this.channel = channel; this.channel = channel;

View File

@ -12,6 +12,7 @@ import com.eu.habbo.habbohotel.rooms.Room;
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.habbohotel.users.HabboItem;
import com.eu.habbo.habbohotel.wired.WiredHandler; import com.eu.habbo.habbohotel.wired.WiredHandler;
import com.eu.habbo.messages.outgoing.guides.GuideSessionPartnerIsPlayingComposer;
import com.eu.habbo.plugin.Event; import com.eu.habbo.plugin.Event;
import com.eu.habbo.plugin.events.games.GameHabboJoinEvent; import com.eu.habbo.plugin.events.games.GameHabboJoinEvent;
import com.eu.habbo.plugin.events.games.GameHabboLeaveEvent; import com.eu.habbo.plugin.events.games.GameHabboLeaveEvent;
@ -68,7 +69,7 @@ public abstract class Game implements Runnable {
habbo.getHabboInfo().setCurrentGame(this.getClass()); habbo.getHabboInfo().setCurrentGame(this.getClass());
habbo.getHabboInfo().setGamePlayer(player); habbo.getHabboInfo().setGamePlayer(player);
} }
habbo.getClient().sendResponse(new GuideSessionPartnerIsPlayingComposer(true));
return true; return true;
} }
} catch (Exception e) { } catch (Exception e) {
@ -90,33 +91,19 @@ public abstract class Game implements Runnable {
GameTeam team = this.getTeamForHabbo(habbo); GameTeam team = this.getTeamForHabbo(habbo);
if (team != null && team.isMember(habbo)) { if (team != null && team.isMember(habbo)) {
if (habbo.getHabboInfo().getGamePlayer() != null) {
team.removeMember(habbo.getHabboInfo().getGamePlayer()); team.removeMember(habbo.getHabboInfo().getGamePlayer());
habbo.getHabboInfo().getGamePlayer().reset(); habbo.getHabboInfo().getGamePlayer().reset();
}
habbo.getHabboInfo().setCurrentGame(null); habbo.getHabboInfo().setCurrentGame(null);
habbo.getHabboInfo().setGamePlayer(null); habbo.getHabboInfo().setGamePlayer(null);
habbo.getClient().sendResponse(new GuideSessionPartnerIsPlayingComposer(false));
if (this.countsAchievements && this.endTime > this.startTime) { if (this.countsAchievements && this.endTime > this.startTime) {
AchievementManager.progressAchievement(habbo, Emulator.getGameEnvironment().getAchievementManager().getAchievement("GamePlayed")); AchievementManager.progressAchievement(habbo, Emulator.getGameEnvironment().getAchievementManager().getAchievement("GamePlayed"));
} }
} }
} }
/*
boolean deleteGame = true;
for (GameTeam team : this.teams.values())
{
if (team.getMembers().size() > 0 )
{
deleteGame = false;
break;
}
}
if (deleteGame)
{
this.room.deleteGame(this);
}
*/
} }
@ -131,8 +118,7 @@ public abstract class Game implements Runnable {
} }
for (HabboItem item : this.room.getRoomSpecialTypes().getItemsOfType(WiredBlob.class)) { for (HabboItem item : this.room.getRoomSpecialTypes().getItemsOfType(WiredBlob.class)) {
item.setExtradata("0"); ((WiredBlob) item).onGameStart(this.room);
this.room.updateItem(item);
} }
} }
@ -190,6 +176,10 @@ public abstract class Game implements Runnable {
((InteractionWiredHighscore) item).reloadData(); ((InteractionWiredHighscore) item).reloadData();
this.room.updateItem(item); this.room.updateItem(item);
} }
for (HabboItem item : this.room.getRoomSpecialTypes().getItemsOfType(WiredBlob.class)) {
((WiredBlob) item).onGameEnd(this.room);
}
} }
public abstract void run(); public abstract void run();

View File

@ -29,6 +29,9 @@ public class GamePlayer {
public synchronized void addScore(int amount) { public synchronized void addScore(int amount) {
if (habbo.getHabboInfo().getGamePlayer() != null && this.habbo.getHabboInfo().getCurrentGame() != null && this.habbo.getHabboInfo().getCurrentRoom().getGame(this.habbo.getHabboInfo().getCurrentGame()).getTeamForHabbo(this.habbo) != null) { if (habbo.getHabboInfo().getGamePlayer() != null && this.habbo.getHabboInfo().getCurrentGame() != null && this.habbo.getHabboInfo().getCurrentRoom().getGame(this.habbo.getHabboInfo().getCurrentGame()).getTeamForHabbo(this.habbo) != null) {
this.score += amount; this.score += amount;
if (this.score < 0) this.score = 0;
WiredHandler.handle(WiredTriggerType.SCORE_ACHIEVED, this.habbo.getRoomUnit(), this.habbo.getHabboInfo().getCurrentRoom(), new Object[]{this.habbo.getHabboInfo().getCurrentRoom().getGame(this.habbo.getHabboInfo().getCurrentGame()).getTeamForHabbo(this.habbo).getTotalScore(), amount}); WiredHandler.handle(WiredTriggerType.SCORE_ACHIEVED, this.habbo.getRoomUnit(), this.habbo.getHabboInfo().getCurrentRoom(), new Object[]{this.habbo.getHabboInfo().getCurrentRoom().getGame(this.habbo.getHabboInfo().getCurrentGame()).getTeamForHabbo(this.habbo).getTotalScore(), amount});
} }
} }

View File

@ -72,7 +72,7 @@ public class GameTeam {
for (GamePlayer player : this.members) { for (GamePlayer player : this.members) {
if (player == null || player.getHabbo() == null) continue; if (player == null || player.getHabbo() == null) continue;
player.getHabbo().getHabboInfo().getGamePlayer().reset(); if (player.getHabbo().getHabboInfo().getGamePlayer() != null) player.getHabbo().getHabboInfo().getGamePlayer().reset();
player.getHabbo().getHabboInfo().setCurrentGame(null); player.getHabbo().getHabboInfo().setCurrentGame(null);
player.getHabbo().getHabboInfo().setGamePlayer(null); player.getHabbo().getHabboInfo().setGamePlayer(null);
} }

View File

@ -157,11 +157,14 @@ public class BattleBanzaiGame extends Game {
public void onEnd() { public void onEnd() {
GameTeam winningTeam = null; GameTeam winningTeam = null;
boolean singleTeamGame = this.teams.values().stream().filter(t -> t.getMembers().size() > 0).count() == 1;
for (GameTeam team : this.teams.values()) { for (GameTeam team : this.teams.values()) {
if (!singleTeamGame) {
for (GamePlayer player : team.getMembers()) { for (GamePlayer player : team.getMembers()) {
if (player.getScore() > 0) { if (player.getScore() > 0) {
AchievementManager.progressAchievement(player.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("BattleBallPlayer")); AchievementManager.progressAchievement(player.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("BattleBallPlayer"));
AchievementManager.progressAchievement(player.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("BattleBallQuestCompleted")); }
} }
} }
@ -171,12 +174,14 @@ public class BattleBanzaiGame extends Game {
} }
if (winningTeam != null) { if (winningTeam != null) {
if (!singleTeamGame) {
for (GamePlayer player : winningTeam.getMembers()) { for (GamePlayer player : winningTeam.getMembers()) {
if (player.getScore() > 0) { if (player.getScore() > 0) {
this.room.sendComposer(new RoomUserActionComposer(player.getHabbo().getRoomUnit(), RoomUserAction.WAVE).compose()); this.room.sendComposer(new RoomUserActionComposer(player.getHabbo().getRoomUnit(), RoomUserAction.WAVE).compose());
AchievementManager.progressAchievement(player.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("BattleBallWinner")); AchievementManager.progressAchievement(player.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("BattleBallWinner"));
} }
} }
}
for (HabboItem item : this.room.getRoomSpecialTypes().getItemsOfType(InteractionBattleBanzaiSphere.class)) { for (HabboItem item : this.room.getRoomSpecialTypes().getItemsOfType(InteractionBattleBanzaiSphere.class)) {
item.setExtradata((6 + winningTeam.teamColor.type) + ""); item.setExtradata((6 + winningTeam.teamColor.type) + "");

View File

@ -2,6 +2,7 @@ package com.eu.habbo.habbohotel.guilds;
import com.eu.habbo.Emulator; import com.eu.habbo.Emulator;
import com.eu.habbo.habbohotel.gameclients.GameClient; import com.eu.habbo.habbohotel.gameclients.GameClient;
import com.eu.habbo.habbohotel.guilds.forums.ForumView;
import com.eu.habbo.habbohotel.items.interactions.InteractionGuildFurni; import com.eu.habbo.habbohotel.items.interactions.InteractionGuildFurni;
import com.eu.habbo.habbohotel.rooms.Room; import com.eu.habbo.habbohotel.rooms.Room;
import com.eu.habbo.habbohotel.users.Habbo; import com.eu.habbo.habbohotel.users.Habbo;
@ -14,10 +15,8 @@ import gnu.trove.map.hash.TIntObjectHashMap;
import gnu.trove.set.hash.THashSet; import gnu.trove.set.hash.THashSet;
import java.sql.*; import java.sql.*;
import java.util.ArrayList; import java.util.*;
import java.util.Collection; import java.util.stream.Collectors;
import java.util.List;
import java.util.NoSuchElementException;
public class GuildManager { public class GuildManager {
@ -25,12 +24,16 @@ public class GuildManager {
private final TIntObjectMap<Guild> guilds; private final TIntObjectMap<Guild> guilds;
private final THashSet<ForumView> views = new THashSet<>();
public GuildManager() { public GuildManager() {
long millis = System.currentTimeMillis(); long millis = System.currentTimeMillis();
this.guildParts = new THashMap<GuildPartType, THashMap<Integer, GuildPart>>(); this.guildParts = new THashMap<GuildPartType, THashMap<Integer, GuildPart>>();
this.guilds = TCollections.synchronizedMap(new TIntObjectHashMap<Guild>()); this.guilds = TCollections.synchronizedMap(new TIntObjectHashMap<Guild>());
this.loadGuildParts(); this.loadGuildParts();
this.loadGuildViews();
Emulator.getLogging().logStart("Guild Manager -> Loaded! (" + (System.currentTimeMillis() - millis) + " MS)"); Emulator.getLogging().logStart("Guild Manager -> Loaded! (" + (System.currentTimeMillis() - millis) + " MS)");
} }
@ -53,6 +56,19 @@ public class GuildManager {
} }
} }
public void loadGuildViews() {
this.views.clear();
try (Connection connection = Emulator.getDatabase().getDataSource().getConnection();
Statement statement = connection.createStatement();
ResultSet set = statement.executeQuery("SELECT * FROM guild_forum_views")) {
while (set.next()) {
this.views.add(new ForumView(set));
}
} catch (SQLException e) {
Emulator.getLogging().logSQLException(e);
}
}
public Guild createGuild(Habbo habbo, int roomId, String roomName, String name, String description, String badge, int colorOne, int colorTwo) { public Guild createGuild(Habbo habbo, int roomId, String roomName, String name, String description, String badge, int colorOne, int colorTwo) {
Guild guild = new Guild(habbo.getHabboInfo().getId(), habbo.getHabboInfo().getUsername(), roomId, roomName, name, description, colorOne, colorTwo, badge); Guild guild = new Guild(habbo.getHabboInfo().getId(), habbo.getHabboInfo().getUsername(), roomId, roomName, name, description, colorOne, colorTwo, badge);
@ -203,7 +219,7 @@ public class GuildManager {
} }
if (userId == 0 && !error) { if (userId == 0 && !error) {
if (guild.getState() == GuildState.LOCKED) { if (guild.getState() == GuildState.EXCLUSIVE) {
try (PreparedStatement statement = connection.prepareStatement("SELECT COUNT(id) as total FROM guilds_members WHERE guild_id = ? AND level_id = 3")) { try (PreparedStatement statement = connection.prepareStatement("SELECT COUNT(id) as total FROM guilds_members WHERE guild_id = ? AND level_id = 3")) {
statement.setInt(1, guild.getId()); statement.setInt(1, guild.getId());
try (ResultSet set = statement.executeQuery()) { try (ResultSet set = statement.executeQuery()) {
@ -236,7 +252,7 @@ public class GuildManager {
statement.setInt(1, guild.getId()); statement.setInt(1, guild.getId());
statement.setInt(2, client.getHabbo().getHabboInfo().getId()); statement.setInt(2, client.getHabbo().getHabboInfo().getId());
statement.setInt(3, Emulator.getIntUnixTimestamp()); statement.setInt(3, Emulator.getIntUnixTimestamp());
statement.setInt(4, guild.getState() == GuildState.LOCKED ? GuildRank.REQUESTED.type : GuildRank.MEMBER.type); statement.setInt(4, guild.getState() == GuildState.EXCLUSIVE ? GuildRank.REQUESTED.type : GuildRank.MEMBER.type);
statement.execute(); statement.execute();
} }
} }
@ -251,7 +267,7 @@ public class GuildManager {
} }
if (userId == 0 && !error) { if (userId == 0 && !error) {
if (guild.getState() == GuildState.LOCKED) if (guild.getState() == GuildState.EXCLUSIVE)
guild.increaseRequestCount(); guild.increaseRequestCount();
else { else {
guild.increaseMemberCount(); guild.increaseMemberCount();
@ -594,4 +610,38 @@ public class GuildManager {
} }
Emulator.getLogging().logShutdownLine("Guild Manager -> Disposed!"); Emulator.getLogging().logShutdownLine("Guild Manager -> Disposed!");
} }
public boolean hasViewedForum(int userId, int guildId) {
return this.views.stream()
.anyMatch(v -> v.getUserId() == userId && v.getGuildId() == guildId && v.getTimestamp() > (Emulator.getIntUnixTimestamp() - 7 * 24 * 60 * 60));
}
public void addView(int userId, int guildId) {
ForumView view = new ForumView(userId, guildId, Emulator.getIntUnixTimestamp());
this.views.add(view);
try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO `guild_forum_views`(`user_id`, `guild_id`, `timestamp`) VALUES (?, ?, ?)")) {
statement.setInt(1, view.getUserId());
statement.setInt(2, view.getGuildId());
statement.setInt(3, view.getTimestamp());
statement.execute();
} catch (SQLException e) {
Emulator.getLogging().logSQLException(e);
}
}
public Set<Guild> getMostViewed() {
return this.views.stream()
.filter(v -> v.getTimestamp() > (Emulator.getIntUnixTimestamp() - 7 * 24 * 60 * 60))
.collect(Collectors.groupingBy(ForumView::getGuildId))
.entrySet()
.stream()
.sorted(Comparator.comparingInt((Map.Entry<Integer, List<ForumView>> a) -> a.getValue().size()))
.map(k -> this.getGuild(k.getKey()))
.filter(g -> g != null && g.canReadForum() == SettingsState.EVERYONE)
.limit(100)
.collect(Collectors.toSet());
}
} }

View File

@ -62,4 +62,12 @@ public class GuildMember implements Comparable {
public int compareTo(Object o) { public int compareTo(Object o) {
return 0; return 0;
} }
public GuildMembershipStatus getMembershipStatus() {
if (this.rank == GuildRank.DELETED) return GuildMembershipStatus.NOT_MEMBER;
if (this.rank == GuildRank.OWNER || this.rank == GuildRank.ADMIN || this.rank == GuildRank.MEMBER) return GuildMembershipStatus.MEMBER;
if (this.rank == GuildRank.REQUESTED) return GuildMembershipStatus.PENDING;
return GuildMembershipStatus.NOT_MEMBER;
}
} }

View File

@ -0,0 +1,17 @@
package com.eu.habbo.habbohotel.guilds;
public enum GuildMembershipStatus {
NOT_MEMBER(0),
MEMBER(1),
PENDING(2);
private int status;
GuildMembershipStatus(int status) {
this.status = status;
}
public int getStatus() {
return status;
}
}

View File

@ -1,8 +1,8 @@
package com.eu.habbo.habbohotel.guilds; package com.eu.habbo.habbohotel.guilds;
public enum GuildRank { public enum GuildRank {
ADMIN(0), OWNER(0),
MOD(1), ADMIN(1),
MEMBER(2), MEMBER(2),
REQUESTED(3), REQUESTED(3),
DELETED(4); DELETED(4);

View File

@ -2,8 +2,10 @@ package com.eu.habbo.habbohotel.guilds;
public enum GuildState { public enum GuildState {
OPEN(0), OPEN(0),
LOCKED(1), EXCLUSIVE(1),
CLOSED(2); CLOSED(2),
LARGE(3),
LARGE_CLOSED(4);
public final int state; public final int state;

View File

@ -192,7 +192,7 @@ public class ForumThreadComment implements Runnable, ISerialize {
if (!this.needsUpdate) if (!this.needsUpdate)
return; return;
try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE guilds_forums_comments` SET `state` = ?, `admin_id` = ? WHERE `id` = ?;")) { try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE guilds_forums_comments SET `state` = ?, `admin_id` = ? WHERE `id` = ?")) {
statement.setInt(1, this.state.getStateId()); statement.setInt(1, this.state.getStateId());
statement.setInt(2, this.adminId); statement.setInt(2, this.adminId);
statement.setInt(3, this.commentId); statement.setInt(3, this.commentId);

View File

@ -0,0 +1,34 @@
package com.eu.habbo.habbohotel.guilds.forums;
import java.sql.ResultSet;
import java.sql.SQLException;
public class ForumView {
private final int userId;
private final int guildId;
private final int timestamp;
public ForumView(int userId, int guildId, int timestamp) {
this.userId = userId;
this.guildId = guildId;
this.timestamp = timestamp;
}
public ForumView(ResultSet set) throws SQLException {
this.userId = set.getInt("user_id");
this.guildId = set.getInt("guild_id");
this.timestamp = set.getInt("timestamp");
}
public int getUserId() {
return userId;
}
public int getGuildId() {
return guildId;
}
public int getTimestamp() {
return timestamp;
}
}

View File

@ -38,6 +38,7 @@ import com.eu.habbo.habbohotel.items.interactions.games.tag.bunnyrun.Interaction
import com.eu.habbo.habbohotel.items.interactions.games.tag.icetag.InteractionIceTagField; import com.eu.habbo.habbohotel.items.interactions.games.tag.icetag.InteractionIceTagField;
import com.eu.habbo.habbohotel.items.interactions.games.tag.icetag.InteractionIceTagPole; import com.eu.habbo.habbohotel.items.interactions.games.tag.icetag.InteractionIceTagPole;
import com.eu.habbo.habbohotel.items.interactions.games.tag.rollerskate.InteractionRollerskateField; import com.eu.habbo.habbohotel.items.interactions.games.tag.rollerskate.InteractionRollerskateField;
import com.eu.habbo.habbohotel.items.interactions.pets.*;
import com.eu.habbo.habbohotel.items.interactions.totems.InteractionTotemHead; import com.eu.habbo.habbohotel.items.interactions.totems.InteractionTotemHead;
import com.eu.habbo.habbohotel.items.interactions.totems.InteractionTotemLegs; import com.eu.habbo.habbohotel.items.interactions.totems.InteractionTotemLegs;
import com.eu.habbo.habbohotel.items.interactions.totems.InteractionTotemPlanet; import com.eu.habbo.habbohotel.items.interactions.totems.InteractionTotemPlanet;
@ -177,6 +178,8 @@ public class ItemManager {
this.interactionsList.add(new ItemInteraction("pressureplate_group", InteractionGroupPressurePlate.class)); this.interactionsList.add(new ItemInteraction("pressureplate_group", InteractionGroupPressurePlate.class));
this.interactionsList.add(new ItemInteraction("effect_tile_group", InteractionEffectTile.class)); this.interactionsList.add(new ItemInteraction("effect_tile_group", InteractionEffectTile.class));
this.interactionsList.add(new ItemInteraction("crackable_subscription_box", InteractionRedeemableSubscriptionBox.class)); this.interactionsList.add(new ItemInteraction("crackable_subscription_box", InteractionRedeemableSubscriptionBox.class));
this.interactionsList.add(new ItemInteraction("random_state", InteractionRandomState.class));
this.interactionsList.add(new ItemInteraction("vendingmachine_no_sides", InteractionNoSidesVendingMachine.class));
this.interactionsList.add(new ItemInteraction("game_timer", InteractionGameTimer.class)); this.interactionsList.add(new ItemInteraction("game_timer", InteractionGameTimer.class));

View File

@ -0,0 +1,41 @@
package com.eu.habbo.habbohotel.items;
import com.eu.habbo.Emulator;
import java.util.Arrays;
public class RandomStateParams {
private int states = -1;
private int delay = -1;
public RandomStateParams(String customparams) throws Exception {
Arrays.stream(customparams.split(",")).forEach(pair -> {
String[] keyValue = pair.split("=");
if (keyValue.length != 2) return;
switch (keyValue[0]) {
case "states":
this.states = Integer.parseInt(keyValue[1]);
break;
case "delay":
this.delay = Integer.parseInt(keyValue[1]);
break;
default:
Emulator.getLogging().logDebugLine("RandomStateParams: unknown key: " + keyValue[0]);
break;
}
});
if (this.states < 0) throw new Exception("RandomStateParams: states not defined");
if (this.delay < 0) throw new Exception("RandomStateParams: states not defined");
}
public int getStates() {
return states;
}
public int getDelay() {
return delay;
}
}

View File

@ -77,6 +77,7 @@ public class YoutubeManager {
long millis = System.currentTimeMillis(); long millis = System.currentTimeMillis();
Emulator.getThreading().run(() -> {
ExecutorService youtubeDataLoaderPool = Executors.newFixedThreadPool(10); ExecutorService youtubeDataLoaderPool = Executors.newFixedThreadPool(10);
Emulator.getLogging().logStart("YouTube Manager -> Loading..."); Emulator.getLogging().logStart("YouTube Manager -> Loading...");
@ -113,6 +114,7 @@ public class YoutubeManager {
} }
Emulator.getLogging().logStart("YouTube Manager -> Loaded! (" + (System.currentTimeMillis() - millis) + " MS)"); Emulator.getLogging().logStart("YouTube Manager -> Loaded! (" + (System.currentTimeMillis() - millis) + " MS)");
});
} }
public YoutubePlaylist getPlaylistDataById(String playlistId) { public YoutubePlaylist getPlaylistDataById(String playlistId) {

View File

@ -3,20 +3,21 @@ package com.eu.habbo.habbohotel.items.interactions;
import com.eu.habbo.Emulator; import com.eu.habbo.Emulator;
import com.eu.habbo.habbohotel.gameclients.GameClient; import com.eu.habbo.habbohotel.gameclients.GameClient;
import com.eu.habbo.habbohotel.items.Item; import com.eu.habbo.habbohotel.items.Item;
import com.eu.habbo.habbohotel.rooms.Room; import com.eu.habbo.habbohotel.rooms.*;
import com.eu.habbo.habbohotel.rooms.RoomTile; import com.eu.habbo.habbohotel.users.Habbo;
import com.eu.habbo.habbohotel.rooms.RoomUnitStatus;
import com.eu.habbo.habbohotel.rooms.RoomUserRotation;
import com.eu.habbo.habbohotel.users.HabboItem; import com.eu.habbo.habbohotel.users.HabboItem;
import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer;
import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer;
import com.eu.habbo.threading.runnables.RoomUnitVendingMachineAction; import com.eu.habbo.threading.runnables.RoomUnitVendingMachineAction;
import com.eu.habbo.threading.runnables.RoomUnitWalkToLocation;
import com.eu.habbo.util.pathfinding.Rotation; import com.eu.habbo.util.pathfinding.Rotation;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class InteractionEffectVendingMachine extends InteractionDefault { public class InteractionEffectVendingMachine extends InteractionVendingMachine {
public InteractionEffectVendingMachine(ResultSet set, Item baseItem) throws SQLException { public InteractionEffectVendingMachine(ResultSet set, Item baseItem) throws SQLException {
super(set, baseItem); super(set, baseItem);
this.setExtradata("0"); this.setExtradata("0");
@ -28,46 +29,7 @@ public class InteractionEffectVendingMachine extends InteractionDefault {
} }
@Override @Override
public void onClick(GameClient client, Room room, Object[] objects) throws Exception { public void giveVendingMachineItem(Habbo habbo, Room room) {
super.onClick(client, room, objects); room.giveEffect(habbo.getRoomUnit(), this.getBaseItem().getRandomVendingItem(), 30);
if (client != null) {
RoomTile tile = getSquareInFront(room.getLayout(), this);
if (tile != null) {
if (tile.equals(client.getHabbo().getRoomUnit().getCurrentLocation())) {
if (this.getExtradata().equals("0") || this.getExtradata().length() == 0) {
room.updateHabbo(client.getHabbo());
if (!client.getHabbo().getRoomUnit().hasStatus(RoomUnitStatus.SIT)) {
client.getHabbo().getRoomUnit().setRotation(RoomUserRotation.values()[Rotation.Calculate(client.getHabbo().getRoomUnit().getX(), client.getHabbo().getRoomUnit().getY(), this.getX(), this.getY())]);
client.getHabbo().getRoomUnit().removeStatus(RoomUnitStatus.MOVE);
room.scheduledComposers.add(new RoomUserStatusComposer(client.getHabbo().getRoomUnit()).compose());
}
this.setExtradata("1");
room.scheduledComposers.add(new FloorItemUpdateComposer(this).compose());
Emulator.getThreading().run(this, 1000);
HabboItem instance = this;
Emulator.getThreading().run(new Runnable() {
@Override
public void run() {
room.giveEffect(client.getHabbo().getRoomUnit(), instance.getBaseItem().getRandomVendingItem(), 30);
}
});
}
} else {
if (!tile.isWalkable()) {
for (RoomTile t : room.getLayout().getTilesAround(room.getLayout().getTile(this.getX(), this.getY()))) {
if (t != null && t.isWalkable()) {
tile = t;
break;
} }
} }
}
client.getHabbo().getRoomUnit().setGoalLocation(tile);
Emulator.getThreading().run(new RoomUnitVendingMachineAction(client.getHabbo(), this, room), client.getHabbo().getRoomUnit().getPath().size() + 2 * 510);
}
}
}
}
}

View File

@ -38,8 +38,6 @@ public class InteractionGate extends HabboItem {
@Override @Override
public void onClick(GameClient client, Room room, Object[] objects) throws Exception { public void onClick(GameClient client, Room room, Object[] objects) throws Exception {
super.onClick(client, room, objects);
boolean isWired = (objects.length >= 2 && objects[1] instanceof WiredEffectType && objects[1] == WiredEffectType.TOGGLE_STATE); boolean isWired = (objects.length >= 2 && objects[1] instanceof WiredEffectType && objects[1] == WiredEffectType.TOGGLE_STATE);
if (client != null && !room.hasRights(client.getHabbo()) && !isWired) if (client != null && !room.hasRights(client.getHabbo()) && !isWired)
return; return;
@ -54,6 +52,8 @@ public class InteractionGate extends HabboItem {
room.updateTile(room.getLayout().getTile(this.getX(), this.getY())); room.updateTile(room.getLayout().getTile(this.getX(), this.getY()));
this.needsUpdate(true); this.needsUpdate(true);
room.updateItemState(this); room.updateItemState(this);
super.onClick(client, room, new Object[]{"TOGGLE_OVERRIDE"});
} }
public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception { public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception {

View File

@ -1,11 +1,9 @@
package com.eu.habbo.habbohotel.items.interactions; package com.eu.habbo.habbohotel.items.interactions;
import com.eu.habbo.habbohotel.bots.Bot;
import com.eu.habbo.habbohotel.gameclients.GameClient; import com.eu.habbo.habbohotel.gameclients.GameClient;
import com.eu.habbo.habbohotel.items.Item; import com.eu.habbo.habbohotel.items.Item;
import com.eu.habbo.habbohotel.rooms.Room; import com.eu.habbo.habbohotel.rooms.*;
import com.eu.habbo.habbohotel.rooms.RoomUnit;
import com.eu.habbo.habbohotel.rooms.RoomUnitStatus;
import com.eu.habbo.habbohotel.rooms.RoomUnitType;
import com.eu.habbo.habbohotel.users.Habbo; import com.eu.habbo.habbohotel.users.Habbo;
import com.eu.habbo.habbohotel.users.HabboGender; import com.eu.habbo.habbohotel.users.HabboGender;
import com.eu.habbo.habbohotel.users.HabboItem; import com.eu.habbo.habbohotel.users.HabboItem;
@ -13,9 +11,14 @@ import com.eu.habbo.habbohotel.wired.WiredEffectType;
import com.eu.habbo.messages.ServerMessage; import com.eu.habbo.messages.ServerMessage;
import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer;
import gnu.trove.set.hash.THashSet; import gnu.trove.set.hash.THashSet;
import org.apache.commons.math3.util.Pair;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
public class InteractionMultiHeight extends HabboItem { public class InteractionMultiHeight extends HabboItem {
public InteractionMultiHeight(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) { public InteractionMultiHeight(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) {
@ -55,6 +58,11 @@ public class InteractionMultiHeight extends HabboItem {
if (objects.length > 0) { if (objects.length > 0) {
if (objects[0] instanceof Integer && room != null) { if (objects[0] instanceof Integer && room != null) {
HabboItem topItem = room.getTopItemAt(this.getX(), this.getY());
if (topItem != null && !topItem.equals(this)) { // multiheight items cannot change height even if there is a stackable item on top - no items allowed on top
return;
}
this.needsUpdate(true); this.needsUpdate(true);
if (this.getExtradata().length() == 0) if (this.getExtradata().length() == 0)
@ -69,26 +77,27 @@ public class InteractionMultiHeight extends HabboItem {
} }
if (this.isWalkable()) { if (this.isWalkable()) {
THashSet<Habbo> habbos = room.getHabbosOnItem(this); List<RoomUnit> unitsOnItem = new ArrayList<>();
THashSet<RoomUnit> updatedUnits = new THashSet<>(); unitsOnItem.addAll(room.getHabbosOnItem(this).stream().map(Habbo::getRoomUnit).filter(Objects::nonNull).collect(Collectors.toList()));
for (Habbo habbo : habbos) { unitsOnItem.addAll(room.getBotsOnItem(this).stream().map(Bot::getRoomUnit).filter(Objects::nonNull).collect(Collectors.toList()));
if (habbo.getRoomUnit() == null)
continue;
if (habbo.getRoomUnit().hasStatus(RoomUnitStatus.MOVE)) THashSet<RoomUnit> updatedUnits = new THashSet<>();
for (RoomUnit unit : unitsOnItem) {
if (unit.hasStatus(RoomUnitStatus.MOVE))
continue; continue;
if (this.getBaseItem().getMultiHeights().length >= 0) { if (this.getBaseItem().getMultiHeights().length >= 0) {
if (this.getBaseItem().allowSit()) { if (this.getBaseItem().allowSit()) {
habbo.getRoomUnit().setStatus(RoomUnitStatus.SIT, this.getBaseItem().getMultiHeights()[(this.getExtradata().isEmpty() ? 0 : Integer.valueOf(this.getExtradata()) % (this.getBaseItem().getMultiHeights().length))] * 1.0D + ""); unit.setStatus(RoomUnitStatus.SIT, this.getBaseItem().getMultiHeights()[(this.getExtradata().isEmpty() ? 0 : Integer.valueOf(this.getExtradata()) % (this.getBaseItem().getMultiHeights().length))] * 1.0D + "");
} else { } else {
habbo.getRoomUnit().setZ(habbo.getRoomUnit().getCurrentLocation().getStackHeight()); unit.setZ(unit.getCurrentLocation().getStackHeight());
habbo.getRoomUnit().setPreviousLocationZ(habbo.getRoomUnit().getZ()); unit.setPreviousLocationZ(unit.getZ());
} }
} }
updatedUnits.add(habbo.getRoomUnit()); updatedUnits.add(unit);
} }
room.sendComposer(new RoomUserStatusComposer(updatedUnits, true).compose()); room.sendComposer(new RoomUserStatusComposer(updatedUnits, true).compose());
} }
} }

View File

@ -13,7 +13,6 @@ import java.sql.SQLException;
public class InteractionMusicDisc extends HabboItem { public class InteractionMusicDisc extends HabboItem {
private int songId; private int songId;
private boolean inQueue;
public InteractionMusicDisc(ResultSet set, Item baseItem) throws SQLException { public InteractionMusicDisc(ResultSet set, Item baseItem) throws SQLException {
super(set, baseItem); super(set, baseItem);
@ -74,21 +73,13 @@ public class InteractionMusicDisc extends HabboItem {
public void onPlace(Room room) { public void onPlace(Room room) {
super.onPlace(room); super.onPlace(room);
room.sendComposer(new JukeBoxMySongsComposer(room.getTraxManager().myList()).compose()); room.getTraxManager().sendUpdatedSongList();
} }
@Override @Override
public void onPickUp(Room room) { public void onPickUp(Room room) {
super.onPickUp(room); super.onPickUp(room);
room.getTraxManager().removeSong(this.getId()); room.getTraxManager().sendUpdatedSongList();
}
public boolean inQueue() {
return this.inQueue;
}
public void inQueue(boolean inQueue) {
this.inQueue = inQueue;
} }
} }

View File

@ -0,0 +1,24 @@
package com.eu.habbo.habbohotel.items.interactions;
import com.eu.habbo.habbohotel.items.Item;
import com.eu.habbo.habbohotel.rooms.Room;
import com.eu.habbo.habbohotel.rooms.RoomTile;
import com.eu.habbo.habbohotel.users.Habbo;
import java.sql.ResultSet;
import java.sql.SQLException;
public class InteractionNoSidesVendingMachine extends InteractionVendingMachine {
public InteractionNoSidesVendingMachine(ResultSet set, Item baseItem) throws SQLException {
super(set, baseItem);
}
public InteractionNoSidesVendingMachine(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) {
super(id, userId, item, extradata, limitedStack, limitedSells);
}
@Override
public RoomTile getRequiredTile(Habbo habbo, Room room) {
return habbo.getRoomUnit().getClosestAdjacentTile(this.getX(), this.getY(), true);
}
}

View File

@ -6,10 +6,12 @@ import com.eu.habbo.habbohotel.rooms.*;
import com.eu.habbo.habbohotel.users.HabboItem; import com.eu.habbo.habbohotel.users.HabboItem;
import com.eu.habbo.messages.ServerMessage; import com.eu.habbo.messages.ServerMessage;
import com.eu.habbo.messages.outgoing.rooms.items.FloorItemOnRollerComposer; import com.eu.habbo.messages.outgoing.rooms.items.FloorItemOnRollerComposer;
import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Optional;
public class InteractionPuzzleBox extends HabboItem { public class InteractionPuzzleBox extends HabboItem {
public InteractionPuzzleBox(ResultSet set, Item baseItem) throws SQLException { public InteractionPuzzleBox(ResultSet set, Item baseItem) throws SQLException {
@ -22,43 +24,56 @@ public class InteractionPuzzleBox extends HabboItem {
@Override @Override
public void onClick(GameClient client, Room room, Object[] objects) throws Exception { public void onClick(GameClient client, Room room, Object[] objects) throws Exception {
if (client.getHabbo().getRoomUnit().hasStatus(RoomUnitStatus.MOVE))
return;
if (!RoomLayout.tilesAdjecent(room.getLayout().getTile(super.getX(), super.getY()), client.getHabbo().getRoomUnit().getCurrentLocation()))
return;
RoomTile boxLocation = room.getLayout().getTile(this.getX(), this.getY()); RoomTile boxLocation = room.getLayout().getTile(this.getX(), this.getY());
client.getHabbo().getRoomUnit().lookAtPoint(boxLocation); RoomUserRotation rotation = null;
room.sendComposer(new RoomUserStatusComposer(client.getHabbo().getRoomUnit()).compose());
switch (client.getHabbo().getRoomUnit().getBodyRotation()) { if (this.getX() == client.getHabbo().getRoomUnit().getX()) {
case NORTH_EAST: if (this.getY() == client.getHabbo().getRoomUnit().getY() + 1) {
case NORTH_WEST: rotation = RoomUserRotation.SOUTH;
case SOUTH_EAST: } else if (this.getY() == client.getHabbo().getRoomUnit().getY() - 1) {
case SOUTH_WEST: rotation = RoomUserRotation.NORTH;
}
} else if (this.getY() == client.getHabbo().getRoomUnit().getY()) {
if (this.getX() == client.getHabbo().getRoomUnit().getX() + 1) {
rotation = RoomUserRotation.EAST;
} else if (this.getX() == client.getHabbo().getRoomUnit().getX() - 1) {
rotation = RoomUserRotation.WEST;
}
}
if (rotation == null) {
RoomTile nearestTile = client.getHabbo().getRoomUnit().getClosestAdjacentTile(this.getX(), this.getY(), false);
if (nearestTile != null) client.getHabbo().getRoomUnit().setGoalLocation(nearestTile);
return; return;
} }
RoomTile tile = room.getLayout().getTileInFront(room.getLayout().getTile(this.getX(), this.getY()), client.getHabbo().getRoomUnit().getBodyRotation().getValue()); super.onClick(client, room, new Object[]{"TOGGLE_OVERRIDE"});
if (tile == null || !room.tileWalkable(tile) || room.hasHabbosAt(tile.x, tile.y)) { RoomTile tile = room.getLayout().getTileInFront(room.getLayout().getTile(this.getX(), this.getY()), rotation.getValue());
if (tile == null || tile.getState() == RoomTileState.INVALID || room.hasHabbosAt(tile.x, tile.y)) {
return; return;
} }
double offset = room.getStackHeight(tile.x, tile.y, false) - this.getZ(); if (!boxLocation.equals(room.getLayout().getTileInFront(client.getHabbo().getRoomUnit().getCurrentLocation(), rotation.getValue())))
if (!boxLocation.equals(room.getLayout().getTileInFront(client.getHabbo().getRoomUnit().getCurrentLocation(), client.getHabbo().getRoomUnit().getBodyRotation().getValue())))
return; return;
HabboItem item = room.getTopItemAt(tile.x, tile.y); HabboItem item = room.getTopItemAt(tile.x, tile.y);
if (item == null || (item.getZ() <= this.getZ() && item.getBaseItem().allowWalk())) { if (item != null && !room.getTopItemAt(tile.x, tile.y).getBaseItem().allowStack()) return;
room.scheduledComposers.add(new FloorItemOnRollerComposer(this, null, tile, offset, room).compose());
client.getHabbo().getRoomUnit().setGoalLocation(boxLocation); this.setZ(room.getStackHeight(tile.x, tile.y, false));
this.needsUpdate(true);
room.updateItem(this);
room.scheduledComposers.add(new FloorItemOnRollerComposer(this, null, tile, 0, room).compose());
room.scheduledTasks.add(() -> {
client.getHabbo().getRoomUnit().setGoalLocation(boxLocation);
room.scheduledTasks.add(() -> client.getHabbo().getRoomUnit().setGoalLocation(boxLocation));
});
this.needsUpdate(true); this.needsUpdate(true);
}
} }
@Override @Override

View File

@ -0,0 +1,42 @@
package com.eu.habbo.habbohotel.items.interactions;
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.RandomStateParams;
import com.eu.habbo.habbohotel.rooms.Room;
import java.sql.ResultSet;
import java.sql.SQLException;
public class InteractionRandomState extends InteractionDefault {
public InteractionRandomState(ResultSet set, Item baseItem) throws SQLException {
super(set, baseItem);
}
public InteractionRandomState(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) {
super(id, userId, item, extradata, limitedStack, limitedSells);
}
@Override
public void onPlace(Room room) {
super.onPlace(room);
this.setExtradata("");
room.updateItemState(this);
}
public void onRandomStateClick(GameClient client, Room room) throws Exception {
RandomStateParams params = new RandomStateParams(this.getBaseItem().getCustomParams());
this.setExtradata("");
room.updateItemState(this);
int randomState = Emulator.getRandom().nextInt(params.getStates()) + 1;
Emulator.getThreading().run(() -> {
this.setExtradata(randomState + "");
room.updateItemState(this);
}, params.getDelay());
}
}

View File

@ -16,6 +16,7 @@ import java.util.List;
public class InteractionRoller extends HabboItem { public class InteractionRoller extends HabboItem {
public static boolean NO_RULES = false; public static boolean NO_RULES = false;
public static int DELAY = 400;
public InteractionRoller(ResultSet set, Item baseItem) throws SQLException { public InteractionRoller(ResultSet set, Item baseItem) throws SQLException {
super(set, baseItem); super(set, baseItem);

View File

@ -1,14 +1,18 @@
package com.eu.habbo.habbohotel.items.interactions; package com.eu.habbo.habbohotel.items.interactions;
import com.eu.habbo.Emulator;
import com.eu.habbo.habbohotel.gameclients.GameClient; import com.eu.habbo.habbohotel.gameclients.GameClient;
import com.eu.habbo.habbohotel.items.Item; import com.eu.habbo.habbohotel.items.Item;
import com.eu.habbo.habbohotel.rooms.Room; import com.eu.habbo.habbohotel.rooms.Room;
import com.eu.habbo.habbohotel.rooms.RoomLayout; import com.eu.habbo.habbohotel.rooms.RoomLayout;
import com.eu.habbo.habbohotel.rooms.RoomTile; import com.eu.habbo.habbohotel.rooms.RoomTile;
import com.eu.habbo.habbohotel.users.Habbo; import com.eu.habbo.habbohotel.users.Habbo;
import com.eu.habbo.threading.runnables.RoomUnitWalkToLocation;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class InteractionSwitch extends InteractionDefault { public class InteractionSwitch extends InteractionDefault {
public InteractionSwitch(ResultSet set, Item baseItem) throws SQLException { public InteractionSwitch(ResultSet set, Item baseItem) throws SQLException {
@ -43,12 +47,22 @@ public class InteractionSwitch extends InteractionDefault {
RoomTile closestTile = null; RoomTile closestTile = null;
for (RoomTile tile : room.getLayout().getTilesAround(room.getLayout().getTile(this.getX(), this.getY()))) { for (RoomTile tile : room.getLayout().getTilesAround(room.getLayout().getTile(this.getX(), this.getY()))) {
if (tile.isWalkable() && (closestTile == null || closestTile.distance(client.getHabbo().getRoomUnit().getCurrentLocation()) > tile.distance(client.getHabbo().getRoomUnit().getCurrentLocation()))) { if (tile.isWalkable() && (closestTile == null || closestTile.distance(client.getHabbo().getRoomUnit().getCurrentLocation()) > tile.distance(client.getHabbo().getRoomUnit().getCurrentLocation()))) {
closestTile = client.getHabbo().getRoomUnit().getCurrentLocation(); closestTile = tile;
} }
} }
if (closestTile != null) { if (closestTile != null && !closestTile.equals(client.getHabbo().getRoomUnit().getCurrentLocation())) {
List<Runnable> onSuccess = new ArrayList<>();
onSuccess.add(() -> {
try {
this.onClick(client, room, objects);
} catch (Exception e) {
e.printStackTrace();
}
});
client.getHabbo().getRoomUnit().setGoalLocation(closestTile); client.getHabbo().getRoomUnit().setGoalLocation(closestTile);
Emulator.getThreading().run(new RoomUnitWalkToLocation(client.getHabbo().getRoomUnit(), closestTile, room, onSuccess, new ArrayList<>()));
} }
} }

View File

@ -83,6 +83,12 @@ public class InteractionTeleport extends HabboItem {
if (this.roomUnitID == unit.getId() && unit.getCurrentLocation().equals(currentLocation)) { if (this.roomUnitID == unit.getId() && unit.getCurrentLocation().equals(currentLocation)) {
startTeleport(room, habbo); startTeleport(room, habbo);
walkable = true; walkable = true;
try {
super.onClick(client, room, new Object[]{"TOGGLE_OVERRIDE"});
} catch (Exception e) {
e.printStackTrace();
}
} else if (unit.getCurrentLocation().equals(currentLocation) || unit.getCurrentLocation().equals(infrontTile)) { } else if (unit.getCurrentLocation().equals(currentLocation) || unit.getCurrentLocation().equals(infrontTile)) {
// set state 1 and walk on item // set state 1 and walk on item
this.roomUnitID = unit.getId(); this.roomUnitID = unit.getId();
@ -133,9 +139,7 @@ public class InteractionTeleport extends HabboItem {
@Override @Override
public void onClick(GameClient client, Room room, Object[] objects) throws Exception { public void onClick(GameClient client, Room room, Object[] objects) throws Exception {
super.onClick(client, room, objects); if (room != null && client != null && objects != null && objects.length <= 1) {
if (room != null && client != null && objects.length <= 1) {
tryTeleport(client, room); tryTeleport(client, room);
} }
} }
@ -201,7 +205,7 @@ public class InteractionTeleport extends HabboItem {
if (habbo.getHabboInfo().getRiding() != null) if (habbo.getHabboInfo().getRiding() != null)
return false; return false;
return this.roomUnitID == -1 || this.roomUnitID == unit.getId(); return true;
} }
public void startTeleport(Room room, Habbo habbo) { public void startTeleport(Room room, Habbo habbo) {

View File

@ -1,6 +1,8 @@
package com.eu.habbo.habbohotel.items.interactions; package com.eu.habbo.habbohotel.items.interactions;
import com.eu.habbo.habbohotel.gameclients.GameClient;
import com.eu.habbo.habbohotel.items.Item; import com.eu.habbo.habbohotel.items.Item;
import com.eu.habbo.habbohotel.rooms.Room;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
@ -13,4 +15,9 @@ public class InteractionTent extends InteractionDefault {
public InteractionTent(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) { public InteractionTent(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) {
super(id, userId, item, extradata, limitedStack, limitedSells); super(id, userId, item, extradata, limitedStack, limitedSells);
} }
@Override
public void onClick(GameClient client, Room room, Object[] objects) throws Exception {
// do nothing
}
} }

View File

@ -1,16 +1,11 @@
package com.eu.habbo.habbohotel.items.interactions; package com.eu.habbo.habbohotel.items.interactions;
import com.eu.habbo.habbohotel.gameclients.GameClient;
import com.eu.habbo.habbohotel.items.Item; import com.eu.habbo.habbohotel.items.Item;
import com.eu.habbo.habbohotel.rooms.Room;
import com.eu.habbo.habbohotel.rooms.RoomUnit;
import com.eu.habbo.habbohotel.users.HabboItem;
import com.eu.habbo.messages.ServerMessage;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
public class InteractionTrophy extends HabboItem { public class InteractionTrophy extends InteractionDefault {
public InteractionTrophy(ResultSet set, Item baseItem) throws SQLException { public InteractionTrophy(ResultSet set, Item baseItem) throws SQLException {
super(set, baseItem); super(set, baseItem);
} }
@ -18,41 +13,4 @@ public class InteractionTrophy extends HabboItem {
public InteractionTrophy(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) { public InteractionTrophy(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) {
super(id, userId, item, extradata, limitedStack, limitedSells); super(id, userId, item, extradata, limitedStack, limitedSells);
} }
@Override
public void serializeExtradata(ServerMessage serverMessage) {
serverMessage.appendInt((this.isLimited() ? 256 : 0));
serverMessage.appendString(this.getExtradata());
super.serializeExtradata(serverMessage);
}
@Override
public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) {
return true;
}
@Override
public boolean isWalkable() {
return false;
}
@Override
public void onClick(GameClient client, Room room, Object[] objects) throws Exception {
super.onClick(client, room, objects);
}
@Override
public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception {
}
@Override
public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception {
}
@Override
public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception {
}
} }

View File

@ -4,17 +4,21 @@ import com.eu.habbo.Emulator;
import com.eu.habbo.habbohotel.gameclients.GameClient; import com.eu.habbo.habbohotel.gameclients.GameClient;
import com.eu.habbo.habbohotel.items.Item; import com.eu.habbo.habbohotel.items.Item;
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.HabboGender; import com.eu.habbo.habbohotel.users.HabboGender;
import com.eu.habbo.habbohotel.users.HabboItem; import com.eu.habbo.habbohotel.users.HabboItem;
import com.eu.habbo.messages.ServerMessage; import com.eu.habbo.messages.ServerMessage;
import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer;
import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer;
import com.eu.habbo.threading.runnables.RoomUnitGiveHanditem; import com.eu.habbo.threading.runnables.RoomUnitGiveHanditem;
import com.eu.habbo.threading.runnables.RoomUnitVendingMachineAction; import com.eu.habbo.threading.runnables.RoomUnitWalkToLocation;
import com.eu.habbo.util.pathfinding.Rotation; import com.eu.habbo.util.pathfinding.Rotation;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
public class InteractionVendingMachine extends HabboItem { public class InteractionVendingMachine extends HabboItem {
public InteractionVendingMachine(ResultSet set, Item baseItem) throws SQLException { public InteractionVendingMachine(ResultSet set, Item baseItem) throws SQLException {
@ -42,26 +46,32 @@ public class InteractionVendingMachine extends HabboItem {
super.onClick(client, room, objects); super.onClick(client, room, objects);
if (client != null) { if (client != null) {
RoomTile tile = getSquareInFront(room.getLayout(), this); RoomTile tile = this.getRequiredTile(client.getHabbo(), room);
if (tile != null) { if (tile != null) {
if (tile.equals(client.getHabbo().getRoomUnit().getCurrentLocation())) { if (tile.equals(client.getHabbo().getRoomUnit().getCurrentLocation())) {
if (this.getExtradata().equals("0") || this.getExtradata().length() == 0) { if (this.getExtradata().equals("0") || this.getExtradata().length() == 0) {
if (!client.getHabbo().getRoomUnit().hasStatus(RoomUnitStatus.SIT) && (!client.getHabbo().getRoomUnit().hasStatus(RoomUnitStatus.MOVE) || tile.equals(client.getHabbo().getRoomUnit().getGoal()))) {
room.updateHabbo(client.getHabbo()); room.updateHabbo(client.getHabbo());
if (!client.getHabbo().getRoomUnit().hasStatus(RoomUnitStatus.SIT)) { this.rotateToMachine(client.getHabbo().getRoomUnit());
client.getHabbo().getRoomUnit().setRotation(RoomUserRotation.values()[Rotation.Calculate(client.getHabbo().getRoomUnit().getX(), client.getHabbo().getRoomUnit().getY(), this.getX(), this.getY())]);
client.getHabbo().getRoomUnit().removeStatus(RoomUnitStatus.MOVE); client.getHabbo().getRoomUnit().removeStatus(RoomUnitStatus.MOVE);
room.scheduledComposers.add(new RoomUserStatusComposer(client.getHabbo().getRoomUnit()).compose()); room.scheduledComposers.add(new RoomUserStatusComposer(client.getHabbo().getRoomUnit()).compose());
} }
super.onClick(client, room, new Object[]{"TOGGLE_OVERRIDE"});
this.setExtradata("1"); this.setExtradata("1");
room.scheduledComposers.add(new FloorItemUpdateComposer(this).compose()); room.scheduledComposers.add(new FloorItemUpdateComposer(this).compose());
Emulator.getThreading().run(() -> {
Emulator.getThreading().run(this, 1000); Emulator.getThreading().run(this, 1000);
Emulator.getThreading().run(new RoomUnitGiveHanditem(client.getHabbo().getRoomUnit(), room, this.getBaseItem().getRandomVendingItem())); this.giveVendingMachineItem(client.getHabbo(), room);
if (this.getBaseItem().getEffectM() > 0 && client.getHabbo().getHabboInfo().getGender() == HabboGender.M) if (this.getBaseItem().getEffectM() > 0 && client.getHabbo().getHabboInfo().getGender() == HabboGender.M)
room.giveEffect(client.getHabbo(), this.getBaseItem().getEffectM(), -1); room.giveEffect(client.getHabbo(), this.getBaseItem().getEffectM(), -1);
if (this.getBaseItem().getEffectF() > 0 && client.getHabbo().getHabboInfo().getGender() == HabboGender.F) if (this.getBaseItem().getEffectF() > 0 && client.getHabbo().getHabboInfo().getGender() == HabboGender.F)
room.giveEffect(client.getHabbo(), this.getBaseItem().getEffectF(), -1); room.giveEffect(client.getHabbo(), this.getBaseItem().getEffectF(), -1);
}, 500);
} }
} else { } else {
if (!tile.isWalkable() && tile.state != RoomTileState.SIT && tile.state != RoomTileState.LAY) { if (!tile.isWalkable() && tile.state != RoomTileState.SIT && tile.state != RoomTileState.LAY) {
@ -72,8 +82,43 @@ public class InteractionVendingMachine extends HabboItem {
} }
} }
} }
RoomTile finalTile = tile;
client.getHabbo().getRoomUnit().setGoalLocation(tile); client.getHabbo().getRoomUnit().setGoalLocation(tile);
Emulator.getThreading().run(new RoomUnitVendingMachineAction(client.getHabbo(), this, room), client.getHabbo().getRoomUnit().getPath().size() + 2 * 510);
Emulator.getThreading().run(new RoomUnitWalkToLocation(client.getHabbo().getRoomUnit(), tile, room, () -> {
this.setExtradata("1");
room.scheduledComposers.add(new FloorItemUpdateComposer(this).compose());
try {
super.onClick(client, room, new Object[]{"TOGGLE_OVERRIDE"});
} catch (Exception e) {
e.printStackTrace();
}
Emulator.getThreading().run(() -> {
client.getHabbo().getRoomUnit().setMoveBlockingTask(Emulator.getThreading().run(() -> {
if (client.getHabbo().getRoomUnit().getCurrentLocation().equals(finalTile)) {
this.rotateToMachine(client.getHabbo().getRoomUnit());
room.sendComposer(new RoomUserStatusComposer(client.getHabbo().getRoomUnit()).compose());
}
try {
Emulator.getThreading().run(() -> {
Emulator.getThreading().run(this, 1000);
this.giveVendingMachineItem(client.getHabbo(), room);
if (this.getBaseItem().getEffectM() > 0 && client.getHabbo().getHabboInfo().getGender() == HabboGender.M)
room.giveEffect(client.getHabbo(), this.getBaseItem().getEffectM(), -1);
if (this.getBaseItem().getEffectF() > 0 && client.getHabbo().getHabboInfo().getGender() == HabboGender.F)
room.giveEffect(client.getHabbo(), this.getBaseItem().getEffectF(), -1);
}, 500).get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}, 300));
}, 250);
}, null));
} }
} }
} }
@ -119,4 +164,45 @@ public class InteractionVendingMachine extends HabboItem {
public boolean isUsable() { public boolean isUsable() {
return true; return true;
} }
private void rotateToMachine(RoomUnit unit) {
RoomUserRotation rotation = RoomUserRotation.values()[Rotation.Calculate(unit.getX(), unit.getY(), this.getX(), this.getY())];
boolean onlyHead = false;
switch (unit.getBodyRotation()) {
case NORTH_EAST:
if (rotation.equals(RoomUserRotation.NORTH) || rotation.equals(RoomUserRotation.EAST))
onlyHead = true;
break;
case NORTH_WEST:
if (rotation.equals(RoomUserRotation.NORTH) || rotation.equals(RoomUserRotation.WEST))
onlyHead = true;
break;
case SOUTH_EAST:
if (rotation.equals(RoomUserRotation.SOUTH) || rotation.equals(RoomUserRotation.EAST))
onlyHead = true;
break;
case SOUTH_WEST:
if (rotation.equals(RoomUserRotation.SOUTH) || rotation.equals(RoomUserRotation.WEST))
onlyHead = true;
break;
}
if (onlyHead) {
unit.setHeadRotation(rotation);
} else {
unit.setRotation(rotation);
}
}
public void giveVendingMachineItem(Habbo habbo, Room room) {
Emulator.getThreading().run(new RoomUnitGiveHanditem(habbo.getRoomUnit(), room, this.getBaseItem().getRandomVendingItem()));
}
public RoomTile getRequiredTile(Habbo habbo, Room room) {
return getSquareInFront(room.getLayout(), this);
}
} }

View File

@ -153,16 +153,20 @@ public class InteractionGameTimer extends HabboItem implements Runnable {
return; return;
} }
this.timeNow--;
if (this.timeNow < 0) this.timeNow = 0;
if (this.timeNow > 0) { if (this.timeNow > 0) {
this.threadActive = true; this.threadActive = true;
Emulator.getThreading().run(this, 1000); Emulator.getThreading().run(this, 1000);
this.timeNow--;
room.updateItem(this);
} else { } else {
this.threadActive = false; this.threadActive = false;
this.timeNow = 0;
this.endGame(room); this.endGame(room);
WiredHandler.handle(WiredTriggerType.GAME_ENDS, null, room, new Object[]{}); WiredHandler.handle(WiredTriggerType.GAME_ENDS, null, room, new Object[]{});
} }
room.updateItem(this);
} }
@Override @Override

View File

@ -124,10 +124,7 @@ public class InteractionBattleBanzaiPuck extends InteractionPushable {
@Override @Override
public boolean validMove(Room room, RoomTile from, RoomTile to) { public boolean validMove(Room room, RoomTile from, RoomTile to) {
if (room == null || from == null || to == null) return false; return room != null && from != null && to != null;
HabboItem topItem = room.getTopItemAt(to.x, to.y, this);
return topItem != null;
//return !(!room.getLayout().tileWalkable(to.x, to.y) || (topItem != null && (!topItem.getBaseItem().setAllowStack() || topItem.getBaseItem().allowSit() || topItem.getBaseItem().allowLay()))); //return !(!room.getLayout().tileWalkable(to.x, to.y) || (topItem != null && (!topItem.getBaseItem().setAllowStack() || topItem.getBaseItem().allowSit() || topItem.getBaseItem().allowLay())));
} }

View File

@ -99,4 +99,23 @@ public class InteractionBattleBanzaiTile extends HabboItem {
return super.canStackAt(room, itemsAtLocation); return super.canStackAt(room, itemsAtLocation);
} }
@Override
public void onPickUp(Room room) {
super.onPickUp(room);
this.setExtradata("0");
room.updateItem(this);
}
@Override
public void onPlace(Room room) {
super.onPlace(room);
BattleBanzaiGame game = (BattleBanzaiGame) room.getGame(BattleBanzaiGame.class);
if (game != null && game.getState() != GameState.IDLE) {
this.setExtradata("1");
}
}
} }

View File

@ -1,6 +1,7 @@
package com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.gates; package com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.gates;
import com.eu.habbo.Emulator; import com.eu.habbo.Emulator;
import com.eu.habbo.habbohotel.games.Game;
import com.eu.habbo.habbohotel.games.GameState; import com.eu.habbo.habbohotel.games.GameState;
import com.eu.habbo.habbohotel.games.GameTeam; import com.eu.habbo.habbohotel.games.GameTeam;
import com.eu.habbo.habbohotel.games.GameTeamColors; import com.eu.habbo.habbohotel.games.GameTeamColors;
@ -28,17 +29,19 @@ public class InteractionBattleBanzaiGate extends InteractionGameGate {
} }
@Override @Override
public boolean isWalkable() { public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception {
Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId());
if (room == null)
return false;
return (this.getExtradata() == null || this.getExtradata().isEmpty() || Integer.valueOf(this.getExtradata()) < 5) && ((room.getGame(BattleBanzaiGame.class))) == null || ((BattleBanzaiGame) (room.getGame(BattleBanzaiGame.class))).state.equals(GameState.IDLE);
} }
@Override @Override
public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception { public boolean isWalkable() {
Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId());
if (room == null) return false;
Game game = room.getGame(BattleBanzaiGame.class);
return game == null || game.getState() == GameState.IDLE;
} }
//TODO: Move to upper class //TODO: Move to upper class

View File

@ -76,7 +76,7 @@ public class InteractionFreezeTile extends HabboItem {
@Override @Override
public boolean canStackAt(Room room, List<Pair<RoomTile, THashSet<HabboItem>>> itemsAtLocation) { public boolean canStackAt(Room room, List<Pair<RoomTile, THashSet<HabboItem>>> itemsAtLocation) {
for (Pair<RoomTile, THashSet<HabboItem>> set : itemsAtLocation) { for (Pair<RoomTile, THashSet<HabboItem>> set : itemsAtLocation) {
if (!set.getValue().isEmpty()) return false; if (set.getValue() != null && !set.getValue().isEmpty()) return false;
} }
return super.canStackAt(room, itemsAtLocation); return super.canStackAt(room, itemsAtLocation);

View File

@ -1,5 +1,7 @@
package com.eu.habbo.habbohotel.items.interactions.games.freeze.gates; package com.eu.habbo.habbohotel.items.interactions.games.freeze.gates;
import com.eu.habbo.Emulator;
import com.eu.habbo.habbohotel.games.Game;
import com.eu.habbo.habbohotel.games.GameState; import com.eu.habbo.habbohotel.games.GameState;
import com.eu.habbo.habbohotel.games.GameTeam; import com.eu.habbo.habbohotel.games.GameTeam;
import com.eu.habbo.habbohotel.games.GameTeamColors; import com.eu.habbo.habbohotel.games.GameTeamColors;
@ -27,18 +29,18 @@ public class InteractionFreezeGate extends InteractionGameGate {
} }
@Override @Override
public boolean isWalkable() { public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception {
if (this.getRoomId() == 0)
return false;
return (this.getExtradata().isEmpty() ||
Integer.valueOf(this.getExtradata()) < 5);
//((Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getGame(FreezeGame.class))) == null ||
//!((FreezeGame)(Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getGame(FreezeGame.class))).isRunning;
} }
@Override @Override
public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception { public boolean isWalkable() {
Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId());
if (room == null) return false;
Game game = room.getGame(FreezeGame.class);
return game == null || game.getState() == GameState.IDLE;
} }
@Override @Override

View File

@ -1,4 +1,4 @@
package com.eu.habbo.habbohotel.items.interactions; package com.eu.habbo.habbohotel.items.interactions.pets;
import com.eu.habbo.Emulator; import com.eu.habbo.Emulator;
import com.eu.habbo.habbohotel.gameclients.GameClient; import com.eu.habbo.habbohotel.gameclients.GameClient;
@ -33,7 +33,7 @@ public class InteractionMonsterPlantSeed extends HabboItem {
public static int randomRarityLevel() { public static int randomRarityLevel() {
int number = Emulator.getRandom().nextInt(66); int number = Emulator.getRandom().nextInt(66);
int count = 0; int count = 0;
for (int i = 1; i <= 11; i++) { for (int i = 1; i < 11; i++) {
count += 11 - i; count += 11 - i;
if (number <= count) { if (number <= count) {
return i; return i;

View File

@ -1,4 +1,4 @@
package com.eu.habbo.habbohotel.items.interactions; package com.eu.habbo.habbohotel.items.interactions.pets;
import com.eu.habbo.habbohotel.gameclients.GameClient; import com.eu.habbo.habbohotel.gameclients.GameClient;
import com.eu.habbo.habbohotel.items.Item; import com.eu.habbo.habbohotel.items.Item;

View File

@ -1,4 +1,4 @@
package com.eu.habbo.habbohotel.items.interactions; package com.eu.habbo.habbohotel.items.interactions.pets;
import com.eu.habbo.Emulator; import com.eu.habbo.Emulator;
import com.eu.habbo.habbohotel.achievements.AchievementManager; import com.eu.habbo.habbohotel.achievements.AchievementManager;

View File

@ -1,8 +1,9 @@
package com.eu.habbo.habbohotel.items.interactions; package com.eu.habbo.habbohotel.items.interactions.pets;
import com.eu.habbo.Emulator; import com.eu.habbo.Emulator;
import com.eu.habbo.habbohotel.achievements.AchievementManager; import com.eu.habbo.habbohotel.achievements.AchievementManager;
import com.eu.habbo.habbohotel.items.Item; import com.eu.habbo.habbohotel.items.Item;
import com.eu.habbo.habbohotel.items.interactions.InteractionDefault;
import com.eu.habbo.habbohotel.pets.Pet; import com.eu.habbo.habbohotel.pets.Pet;
import com.eu.habbo.habbohotel.pets.PetTasks; import com.eu.habbo.habbohotel.pets.PetTasks;
import com.eu.habbo.habbohotel.rooms.Room; import com.eu.habbo.habbohotel.rooms.Room;

View File

@ -1,7 +1,8 @@
package com.eu.habbo.habbohotel.items.interactions; package com.eu.habbo.habbohotel.items.interactions.pets;
import com.eu.habbo.Emulator; import com.eu.habbo.Emulator;
import com.eu.habbo.habbohotel.items.Item; import com.eu.habbo.habbohotel.items.Item;
import com.eu.habbo.habbohotel.items.interactions.InteractionDefault;
import com.eu.habbo.habbohotel.pets.Pet; import com.eu.habbo.habbohotel.pets.Pet;
import com.eu.habbo.habbohotel.pets.PetTasks; import com.eu.habbo.habbohotel.pets.PetTasks;
import com.eu.habbo.habbohotel.rooms.Room; import com.eu.habbo.habbohotel.rooms.Room;

View File

@ -1,7 +1,8 @@
package com.eu.habbo.habbohotel.items.interactions; package com.eu.habbo.habbohotel.items.interactions.pets;
import com.eu.habbo.Emulator; import com.eu.habbo.Emulator;
import com.eu.habbo.habbohotel.items.Item; import com.eu.habbo.habbohotel.items.Item;
import com.eu.habbo.habbohotel.items.interactions.InteractionDefault;
import com.eu.habbo.habbohotel.pets.Pet; import com.eu.habbo.habbohotel.pets.Pet;
import com.eu.habbo.habbohotel.pets.PetTasks; import com.eu.habbo.habbohotel.pets.PetTasks;
import com.eu.habbo.habbohotel.rooms.Room; import com.eu.habbo.habbohotel.rooms.Room;

View File

@ -35,7 +35,12 @@ public class InteractionTotemHead extends InteractionDefault {
} }
public TotemColor getTotemColor() { public TotemColor getTotemColor() {
int extraData = Integer.parseInt(this.getExtradata()); int extraData;
try {
extraData = Integer.parseInt(this.getExtradata());
}catch(NumberFormatException ex) {
extraData = 0;
}
if(extraData < 3) { if(extraData < 3) {
return TotemColor.NONE; return TotemColor.NONE;
} }

View File

@ -31,7 +31,12 @@ public class InteractionTotemLegs extends InteractionDefault {
} }
public TotemColor getTotemColor() { public TotemColor getTotemColor() {
int extraData = Integer.parseInt(this.getExtradata()); int extraData;
try {
extraData = Integer.parseInt(this.getExtradata());
} catch(NumberFormatException ex) {
extraData = 0;
}
return TotemColor.fromInt(extraData - (4 * (getTotemType().type - 1))); return TotemColor.fromInt(extraData - (4 * (getTotemType().type - 1)));
} }

View File

@ -33,6 +33,11 @@ public class InteractionTotemPlanet extends InteractionDefault {
@Override @Override
public void onClick(GameClient client, Room room, Object[] objects) throws Exception { public void onClick(GameClient client, Room room, Object[] objects) throws Exception {
if(client.getHabbo().getHabboInfo().getId() != this.getUserId()) {
super.onClick(client, room, objects);
return;
}
InteractionTotemLegs legs = null; InteractionTotemLegs legs = null;
InteractionTotemHead head = null; InteractionTotemHead head = null;

View File

@ -34,6 +34,7 @@ public class WiredConditionNotInTeam extends InteractionWiredCondition {
if (habbo.getHabboInfo().getGamePlayer() != null) { if (habbo.getHabboInfo().getGamePlayer() != null) {
return !habbo.getHabboInfo().getGamePlayer().getTeamColor().equals(this.teamColor); return !habbo.getHabboInfo().getGamePlayer().getTeamColor().equals(this.teamColor);
} }
return true; // user is not part of any team
} }
return false; return false;

View File

@ -96,8 +96,13 @@ public class WiredEffectBotGiveHandItem extends InteractionWiredEffect {
List<Runnable> tasks = new ArrayList<>(); List<Runnable> tasks = new ArrayList<>();
tasks.add(new RoomUnitGiveHanditem(habbo.getRoomUnit(), room, this.itemId)); tasks.add(new RoomUnitGiveHanditem(habbo.getRoomUnit(), room, this.itemId));
tasks.add(new RoomUnitGiveHanditem(bot.getRoomUnit(), room, 0)); tasks.add(new RoomUnitGiveHanditem(bot.getRoomUnit(), room, 0));
Emulator.getThreading().run(new RoomUnitGiveHanditem(bot.getRoomUnit(), room, this.itemId)); Emulator.getThreading().run(new RoomUnitGiveHanditem(bot.getRoomUnit(), room, this.itemId));
Emulator.getThreading().run(new RoomUnitWalkToRoomUnit(bot.getRoomUnit(), habbo.getRoomUnit(), room, tasks, null));
List<Runnable> failedReach = new ArrayList<>();
failedReach.add(() -> tasks.forEach(Runnable::run));
Emulator.getThreading().run(new RoomUnitWalkToRoomUnit(bot.getRoomUnit(), habbo.getRoomUnit(), room, tasks, failedReach));
} }
return true; return true;

View File

@ -107,7 +107,7 @@ public class WiredEffectBotTeleport extends InteractionWiredEffect {
int currentEffect = bot.getRoomUnit().getEffectId(); int currentEffect = bot.getRoomUnit().getEffectId();
room.giveEffect(bot.getRoomUnit(), 4, -1); room.giveEffect(bot.getRoomUnit(), 4, -1);
Emulator.getThreading().run(new SendRoomUnitEffectComposer(room, bot.getRoomUnit()), WiredHandler.TELEPORT_DELAY + 1000); Emulator.getThreading().run(() -> room.giveEffect(bot.getRoomUnit(), 0, -1), WiredHandler.TELEPORT_DELAY + 1000);
Emulator.getThreading().run(new RoomUnitTeleport(bot.getRoomUnit(), room, item.getX(), item.getY(), item.getZ() + item.getBaseItem().getHeight() + (item.getBaseItem().allowSit() ? -0.50 : 0D), currentEffect), WiredHandler.TELEPORT_DELAY); Emulator.getThreading().run(new RoomUnitTeleport(bot.getRoomUnit(), room, item.getX(), item.getY(), item.getZ() + item.getBaseItem().getHeight() + (item.getBaseItem().allowSit() ? -0.50 : 0D), currentEffect), WiredHandler.TELEPORT_DELAY);
break; break;
} else { } else {

View File

@ -62,7 +62,7 @@ public class WiredEffectChangeFurniDirection extends InteractionWiredEffect {
RoomTile targetTile = room.getLayout().getTileInFront(room.getLayout().getTile(entry.getKey().getX(), entry.getKey().getY()), entry.getValue().getValue()); RoomTile targetTile = room.getLayout().getTileInFront(room.getLayout().getTile(entry.getKey().getX(), entry.getKey().getY()), entry.getValue().getValue());
int count = 1; int count = 1;
while ((targetTile == null || !targetTile.getAllowStack() || targetTile.state == RoomTileState.INVALID) && count < 8) { while ((targetTile == null || !targetTile.getAllowStack() || targetTile.state == RoomTileState.INVALID || targetTile.state == RoomTileState.BLOCKED) && count < 8) {
entry.setValue(this.nextRotation(entry.getValue())); entry.setValue(this.nextRotation(entry.getValue()));
targetTile = room.getLayout().getTileInFront(room.getLayout().getTile(entry.getKey().getX(), entry.getKey().getY()), entry.getValue().getValue()); targetTile = room.getLayout().getTileInFront(room.getLayout().getTile(entry.getKey().getX(), entry.getKey().getY()), entry.getValue().getValue());
count++; count++;

View File

@ -16,7 +16,6 @@ import com.eu.habbo.habbohotel.wired.WiredMatchFurniSetting;
import com.eu.habbo.messages.ClientMessage; import com.eu.habbo.messages.ClientMessage;
import com.eu.habbo.messages.ServerMessage; import com.eu.habbo.messages.ServerMessage;
import com.eu.habbo.messages.outgoing.rooms.items.FloorItemOnRollerComposer; import com.eu.habbo.messages.outgoing.rooms.items.FloorItemOnRollerComposer;
import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer;
import gnu.trove.set.hash.THashSet; import gnu.trove.set.hash.THashSet;
import java.sql.ResultSet; import java.sql.ResultSet;
@ -45,6 +44,9 @@ public class WiredEffectMatchFurni extends InteractionWiredEffect {
THashSet<RoomTile> tilesToUpdate = new THashSet<>(this.settings.size()); THashSet<RoomTile> tilesToUpdate = new THashSet<>(this.settings.size());
//this.refresh(); //this.refresh();
if(this.settings.isEmpty())
return false;
for (WiredMatchFurniSetting setting : this.settings) { for (WiredMatchFurniSetting setting : this.settings) {
HabboItem item = room.getHabboItem(setting.itemId); HabboItem item = room.getHabboItem(setting.itemId);
if (item != null) { if (item != null) {
@ -57,19 +59,30 @@ public class WiredEffectMatchFurni extends InteractionWiredEffect {
int oldRotation = item.getRotation(); int oldRotation = item.getRotation();
boolean slideAnimation = true; boolean slideAnimation = true;
if (this.direction) { double offsetZ = 0;
if (this.direction && item.getRotation() != setting.rotation) {
item.setRotation(setting.rotation); item.setRotation(setting.rotation);
slideAnimation = false; slideAnimation = false;
room.scheduledTasks.add(() -> {
room.getLayout().getTilesAt(room.getLayout().getTile(item.getX(), item.getY()), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), oldRotation).forEach(t -> {
room.updateBotsAt(t.x, t.y);
room.updateHabbosAt(t.x, t.y);
});
room.getLayout().getTilesAt(room.getLayout().getTile(item.getX(), item.getY()), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), setting.rotation).forEach(t -> {
room.updateBotsAt(t.x, t.y);
room.updateHabbosAt(t.x, t.y);
});
});
} }
//room.sendComposer(new ItemStateComposer(item).compose()); RoomTile t = null;
room.sendComposer(new FloorItemUpdateComposer(item).compose());
if (this.position) { if (this.position) {
RoomTile t = room.getLayout().getTile((short) setting.x, (short) setting.y); t = room.getLayout().getTile((short) setting.x, (short) setting.y);
if (t != null) { if (t != null && t.state != RoomTileState.INVALID) {
if (t.state != RoomTileState.INVALID) {
boolean canMove = true; boolean canMove = true;
if (t.x == item.getX() && t.y == item.getY()) { if (t.x == item.getX() && t.y == item.getY()) {
@ -100,7 +113,7 @@ public class WiredEffectMatchFurni extends InteractionWiredEffect {
if (highestZ != -1d) { if (highestZ != -1d) {
tilesToUpdate.addAll(tiles); tilesToUpdate.addAll(tiles);
double offsetZ = highestZ - item.getZ(); offsetZ = highestZ - item.getZ();
double totalHeight = item.getZ() + offsetZ; double totalHeight = item.getZ() + offsetZ;
if (totalHeight > 40) break; if (totalHeight > 40) break;
tilesToUpdate.addAll(room.getLayout().getTilesAt(room.getLayout().getTile(item.getX(), item.getY()), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), oldRotation)); tilesToUpdate.addAll(room.getLayout().getTilesAt(room.getLayout().getTile(item.getX(), item.getY()), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), oldRotation));
@ -109,12 +122,15 @@ public class WiredEffectMatchFurni extends InteractionWiredEffect {
item.setX(t.x); item.setX(t.x);
item.setY(t.y); item.setY(t.y);
} }
}
}
}
}
if (slideAnimation && t != null) {
room.sendComposer(new FloorItemOnRollerComposer(item, null, t, offsetZ, room).compose()); room.sendComposer(new FloorItemOnRollerComposer(item, null, t, offsetZ, room).compose());
} } else {
} room.updateItem(item);
}
}
} }
item.needsUpdate(true); item.needsUpdate(true);

View File

@ -39,98 +39,38 @@ public class WiredEffectMoveRotateFurni extends InteractionWiredEffect {
@Override @Override
public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) { public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) {
THashSet<HabboItem> items = new THashSet<>(this.items.size()); // remove items that are no longer in the room
this.items.removeIf( item -> Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(item.getId()) == null);
THashSet<RoomTile> tilesToUpdate = new THashSet<>(Math.min(this.items.size(), 10)); THashSet<RoomTile> tilesToUpdate = new THashSet<>(Math.min(this.items.size(), 10));
for (HabboItem item : this.items) {
if (Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(item.getId()) == null)
items.add(item);
}
for (HabboItem item : items) {
this.items.remove(item);
}
for (HabboItem item : this.items) { for (HabboItem item : this.items) {
//Handle rotation //Handle rotation
int rotationToAdd = 0;
if (this.rotation > 0) { if (this.rotation > 0) {
tilesToUpdate.addAll(room.getLayout().getTilesAt(room.getLayout().getTile(item.getX(), item.getY()), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), item.getRotation())); tilesToUpdate.addAll(room.getLayout().getTilesAt(room.getLayout().getTile(item.getX(), item.getY()), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), item.getRotation()));
if (this.rotation == 1) { int newRotation = this.getNewRotation(item);
rotationToAdd = 2;
} else if (this.rotation == 2) {
rotationToAdd = 6;
}
//Random rotation
else if (this.rotation == 3) {
if (Emulator.getRandom().nextInt(2) == 1) {
rotationToAdd = 2;
} else {
rotationToAdd = 6;
}
}
}
int newRotation = ((item.getRotation() + rotationToAdd) % 8) % (item.getBaseItem().getWidth() > 1 || item.getBaseItem().getLength() > 1 ? 4 : 8);
//Verify if rotation result in a valid position //Verify if rotation result in a valid position
if (rotationToAdd > 0 && room.furnitureFitsAt(room.getLayout().getTile(item.getX(), item.getY()), item, newRotation).equals(FurnitureMovementError.NONE))//room.canPlaceFurnitureAt(item, null, room.getLayout().getTile(item.getX(), item.getY()), item.getRotation() + rotationToAdd)) FurnitureMovementError rotateError = room.furnitureFitsAt(room.getLayout().getTile(item.getX(), item.getY()), item, newRotation);
if (item.getRotation() != newRotation && (rotateError.equals(FurnitureMovementError.TILE_HAS_HABBOS) || rotateError.equals(FurnitureMovementError.TILE_HAS_PETS) ||
rotateError.equals(FurnitureMovementError.TILE_HAS_BOTS) || rotateError.equals(FurnitureMovementError.NONE)))
{ {
item.setRotation(newRotation); item.setRotation(newRotation);
if(this.direction == 0) { if(this.direction == 0) {
tilesToUpdate.addAll(room.getLayout().getTilesAt(room.getLayout().getTile(item.getX(), item.getY()), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), item.getRotation())); tilesToUpdate.addAll(room.getLayout().getTilesAt(room.getLayout().getTile(item.getX(), item.getY()), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), item.getRotation()));
room.sendComposer(new FloorItemUpdateComposer(item).compose()); room.sendComposer(new FloorItemUpdateComposer(item).compose());
for (RoomTile t : tilesToUpdate) {
room.updateHabbosAt(t.x, t.y);
room.updateBotsAt(t.x, t.y);
}
}
} }
} }
//handle movement
if (this.direction > 0) { if (this.direction > 0) {
int nextDirectionOffset = 0; RoomUserRotation moveDirection = this.getMovementDirection();
RoomUserRotation startMoveDirection = RoomUserRotation.NORTH;
RoomUserRotation moveDirection = null;
if (this.direction == 1) {
startMoveDirection = RoomUserRotation.values()[Emulator.getRandom().nextInt(RoomUserRotation.values().length / 2) * 2];
nextDirectionOffset = 2;
} else if (this.direction == 2) {
if (Emulator.getRandom().nextInt(2) == 1) {
startMoveDirection = RoomUserRotation.EAST;
nextDirectionOffset = 4;
} else {
startMoveDirection = RoomUserRotation.WEST;
nextDirectionOffset = 4;
}
} else if (this.direction == 3) {
if (Emulator.getRandom().nextInt(2) == 1) {
startMoveDirection = RoomUserRotation.NORTH;
nextDirectionOffset = 4;
} else {
startMoveDirection = RoomUserRotation.SOUTH;
nextDirectionOffset = 4;
}
} else if (this.direction == 4) {
startMoveDirection = RoomUserRotation.SOUTH;
nextDirectionOffset = 8;
} else if (this.direction == 5) {
startMoveDirection = RoomUserRotation.EAST;
nextDirectionOffset = 8;
} else if (this.direction == 6) {
startMoveDirection = RoomUserRotation.NORTH;
nextDirectionOffset = 8;
} else if (this.direction == 7) {
startMoveDirection = RoomUserRotation.WEST;
nextDirectionOffset = 8;
}
boolean validMove = false; boolean validMove = false;
int count = 0;
int maxCount = 8 / nextDirectionOffset;
while (moveDirection != startMoveDirection && !validMove && count < maxCount) {
count++;
if (moveDirection == null) {
moveDirection = startMoveDirection;
}
RoomLayout layout = room.getLayout(); RoomLayout layout = room.getLayout();
if (layout == null) return false; if (layout == null) return false;
@ -161,7 +101,6 @@ public class WiredEffectMoveRotateFurni extends InteractionWiredEffect {
for (short y = (short) rectangle.y; y < rectangle.y + rectangle.getHeight(); y++) { for (short y = (short) rectangle.y; y < rectangle.y + rectangle.getHeight(); y++) {
RoomTile tile = layout.getTile(x, y); RoomTile tile = layout.getTile(x, y);
if (tile == null || tile.state == RoomTileState.INVALID || !tile.getAllowStack()) { if (tile == null || tile.state == RoomTileState.INVALID || !tile.getAllowStack()) {
validMove = false; validMove = false;
break; break;
@ -173,7 +112,7 @@ public class WiredEffectMoveRotateFurni extends InteractionWiredEffect {
break; break;
} }
java.util.List tileItems = new ArrayList<Pair<RoomTile, THashSet<HabboItem>>>(rectangle.width * rectangle.height); ArrayList<Pair<RoomTile, THashSet<HabboItem>>> tileItems = new ArrayList<>(rectangle.width * rectangle.height);
tileItems.add(Pair.create(tile, itemsAtNewTile)); tileItems.add(Pair.create(tile, itemsAtNewTile));
if (!item.canStackAt(room, tileItems)) { if (!item.canStackAt(room, tileItems)) {
validMove = false; validMove = false;
@ -181,9 +120,13 @@ public class WiredEffectMoveRotateFurni extends InteractionWiredEffect {
} }
HabboItem i = room.getTopItemAt(x, y, item); HabboItem i = room.getTopItemAt(x, y, item);
if (i == null || i == item || i.getBaseItem().allowStack()) { if (i != null && !i.getBaseItem().allowStack()) {
offset = Math.max(room.getStackHeight(newTile.x, newTile.y, false, item) - item.getZ(), offset); validMove = false;
break;
} }
offset = Math.max(room.getStackHeight(newTile.x, newTile.y, false, item) - item.getZ(), offset);
tilesToUpdate.add(tile); tilesToUpdate.add(tile);
} }
} }
@ -192,13 +135,21 @@ public class WiredEffectMoveRotateFurni extends InteractionWiredEffect {
} }
if (validMove) { if (validMove) {
if(this.rotation > 0) {
item.setX(newTile.x);
item.setY(newTile.y);
item.setZ(item.getZ() + offset);
room.sendComposer(new FloorItemUpdateComposer(item).compose());
for (RoomTile t : tilesToUpdate) {
room.updateHabbosAt(t.x, t.y);
room.updateBotsAt(t.x, t.y);
}
}
else {
room.sendComposer(new FloorItemOnRollerComposer(item, null, newTile, offset, room).compose()); room.sendComposer(new FloorItemOnRollerComposer(item, null, newTile, offset, room).compose());
} }
} }
} }
if (!validMove) {
moveDirection = RoomUserRotation.fromValue(moveDirection.getValue() + nextDirectionOffset);
}
} }
} }
} }
@ -244,14 +195,14 @@ public class WiredEffectMoveRotateFurni extends InteractionWiredEffect {
if (data.length == 4) { if (data.length == 4) {
try { try {
this.direction = Integer.valueOf(data[0]); this.direction = Integer.parseInt(data[0]);
this.rotation = Integer.valueOf(data[1]); this.rotation = Integer.parseInt(data[1]);
this.setDelay(Integer.valueOf(data[2])); this.setDelay(Integer.parseInt(data[2]));
} catch (Exception e) { } catch (Exception e) {
} }
for (String s : data[3].split("\r")) { for (String s : data[3].split("\r")) {
HabboItem item = room.getHabboItem(Integer.valueOf(s)); HabboItem item = room.getHabboItem(Integer.parseInt(s));
if (item != null) if (item != null)
this.items.add(item); this.items.add(item);
@ -328,8 +279,60 @@ public class WiredEffectMoveRotateFurni extends InteractionWiredEffect {
return true; return true;
} }
@Override
protected long requiredCooldown() { /**
return 100; * Returns a new rotation for an item based on the wired options
* @param item
* @return new rotation
*/
private int getNewRotation(HabboItem item) {
int rotationToAdd = 0;
if (this.rotation == 1) {
rotationToAdd = 2;
} else if (this.rotation == 2) {
rotationToAdd = 6;
}
//Random rotation
else if (this.rotation == 3) {
if (Emulator.getRandom().nextInt(2) == 1) {
rotationToAdd = 2;
} else {
rotationToAdd = 6;
}
}
return ((item.getRotation() + rotationToAdd) % 8) % (item.getBaseItem().getWidth() > 1 || item.getBaseItem().getLength() > 1 ? 4 : 8);
}
/**
* Returns the direction of movement based on the wired settings
* @return direction
*/
private RoomUserRotation getMovementDirection() {
RoomUserRotation movemementDirection = RoomUserRotation.NORTH;
if (this.direction == 1) {
movemementDirection = RoomUserRotation.values()[Emulator.getRandom().nextInt(RoomUserRotation.values().length / 2) * 2];
} else if (this.direction == 2) {
if (Emulator.getRandom().nextInt(2) == 1) {
movemementDirection = RoomUserRotation.EAST;
} else {
movemementDirection = RoomUserRotation.WEST;
}
} else if (this.direction == 3) {
if (Emulator.getRandom().nextInt(2) == 1) {
movemementDirection = RoomUserRotation.NORTH;
} else {
movemementDirection = RoomUserRotation.SOUTH;
}
} else if (this.direction == 4) {
movemementDirection = RoomUserRotation.SOUTH;
} else if (this.direction == 5) {
movemementDirection = RoomUserRotation.EAST;
} else if (this.direction == 6) {
movemementDirection = RoomUserRotation.NORTH;
} else if (this.direction == 7) {
movemementDirection = RoomUserRotation.WEST;
}
return movemementDirection;
} }
} }

View File

@ -42,7 +42,7 @@ public class WiredEffectTeleport extends InteractionWiredEffect {
} }
public static void teleportUnitToTile(RoomUnit roomUnit, RoomTile tile) { public static void teleportUnitToTile(RoomUnit roomUnit, RoomTile tile) {
if (roomUnit == null || tile == null) if (roomUnit == null || tile == null || roomUnit.isWiredTeleporting)
return; return;
Room room = roomUnit.getRoom(); Room room = roomUnit.getRoom();
@ -63,6 +63,7 @@ public class WiredEffectTeleport extends InteractionWiredEffect {
for (RoomTile optionalTile : optionalTiles) { for (RoomTile optionalTile : optionalTiles) {
if (optionalTile.state != RoomTileState.INVALID && optionalTile.state != RoomTileState.BLOCKED) { if (optionalTile.state != RoomTileState.INVALID && optionalTile.state != RoomTileState.BLOCKED) {
alternativeTile = optionalTile; alternativeTile = optionalTile;
break;
} }
} }
@ -139,30 +140,13 @@ public class WiredEffectTeleport extends InteractionWiredEffect {
@Override @Override
public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) { public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) {
THashSet<HabboItem> items = new THashSet<>(); this.items.removeIf(item -> item == null || item.getRoomId() != this.getRoomId()
|| Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(item.getId()) == null);
for (HabboItem item : this.items) {
if (item.getRoomId() != this.getRoomId() || Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(item.getId()) == null)
items.add(item);
}
for (HabboItem item : items) {
this.items.remove(item);
}
if (!this.items.isEmpty()) { if (!this.items.isEmpty()) {
int i = Emulator.getRandom().nextInt(this.items.size()) + 1; int i = Emulator.getRandom().nextInt(this.items.size());
int j = 1; HabboItem item = this.items.get(i);
int tryCount = 0;
while (tryCount < this.items.size()) {
tryCount++;
HabboItem item = this.items.get((tryCount - 1 + i) % this.items.size());
teleportUnitToTile(roomUnit, room.getLayout().getTile(item.getX(), item.getY())); teleportUnitToTile(roomUnit, room.getLayout().getTile(item.getX(), item.getY()));
break;
}
return true; return true;
} }
@ -220,6 +204,6 @@ public class WiredEffectTeleport extends InteractionWiredEffect {
@Override @Override
protected long requiredCooldown() { protected long requiredCooldown() {
return 0; return 50L;
} }
} }

View File

@ -1,66 +1,120 @@
package com.eu.habbo.habbohotel.items.interactions.wired.extra; package com.eu.habbo.habbohotel.items.interactions.wired.extra;
import com.eu.habbo.Emulator; import com.eu.habbo.Emulator;
import com.eu.habbo.habbohotel.games.Game; import com.eu.habbo.habbohotel.gameclients.GameClient;
import com.eu.habbo.habbohotel.games.GamePlayer; import com.eu.habbo.habbohotel.games.GamePlayer;
import com.eu.habbo.habbohotel.games.GameTeam; import com.eu.habbo.habbohotel.games.GameState;
import com.eu.habbo.habbohotel.games.battlebanzai.BattleBanzaiGame;
import com.eu.habbo.habbohotel.games.freeze.FreezeGame;
import com.eu.habbo.habbohotel.items.Item; import com.eu.habbo.habbohotel.items.Item;
import com.eu.habbo.habbohotel.items.interactions.InteractionDefault; import com.eu.habbo.habbohotel.items.interactions.InteractionDefault;
import com.eu.habbo.habbohotel.rooms.Room; import com.eu.habbo.habbohotel.rooms.Room;
import com.eu.habbo.habbohotel.rooms.RoomUnit; import com.eu.habbo.habbohotel.rooms.RoomUnit;
import com.eu.habbo.habbohotel.users.Habbo; import com.eu.habbo.habbohotel.users.Habbo;
import com.eu.habbo.habbohotel.wired.WiredEffectType;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
public class WiredBlob extends InteractionDefault { public class WiredBlob extends InteractionDefault {
enum WiredBlobState {
ACTIVE("0"),
USED("1");
private String state;
WiredBlobState(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
private int POINTS_REWARD = 0;
private boolean RESETS_WITH_GAME = true;
public WiredBlob(ResultSet set, Item baseItem) throws SQLException { public WiredBlob(ResultSet set, Item baseItem) throws SQLException {
super(set, baseItem); super(set, baseItem);
this.parseCustomParams();
} }
public WiredBlob(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) { public WiredBlob(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) {
super(id, userId, item, extradata, limitedStack, limitedSells); super(id, userId, item, extradata, limitedStack, limitedSells);
this.parseCustomParams();
}
@Override
public void onPlace(Room room) {
super.onPlace(room);
this.setExtradata(WiredBlobState.USED.getState());
room.updateItem(this);
} }
@Override @Override
public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception { public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception {
super.onWalkOn(roomUnit, room, objects); super.onWalkOn(roomUnit, room, objects);
if (this.getExtradata().equals("0")) { if (!this.getExtradata().equals(WiredBlobState.ACTIVE.getState())) return;
Habbo habbo = room.getHabbo(roomUnit); Habbo habbo = room.getHabbo(roomUnit);
if (habbo != null && habbo.getHabboInfo().getCurrentGame() != null) { if (habbo != null) {
int points = Emulator.getConfig().getInt("hotel.item.wiredblob." + this.getBaseItem().getName());
if (points == 0) {
Emulator.getConfig().register("hotel.item.wiredblob." + this.getBaseItem().getName(), "3000");
points = 1;
}
boolean triggered = false;
Game game = room.getGame(habbo.getHabboInfo().getCurrentGame());
if (game != null) {
GameTeam team = game.getTeamForHabbo(habbo);
if (team != null) {
team.addTeamScore(points);
triggered = true;
} else {
GamePlayer player = habbo.getHabboInfo().getGamePlayer(); GamePlayer player = habbo.getHabboInfo().getGamePlayer();
if (player != null) { if (player != null) {
player.addScore(points); player.addScore(this.POINTS_REWARD);
triggered = true;
} BattleBanzaiGame battleBanzaiGame = (BattleBanzaiGame) room.getGame(BattleBanzaiGame.class);
}
if (battleBanzaiGame != null && battleBanzaiGame.getState() != GameState.IDLE) {
battleBanzaiGame.refreshCounters(habbo.getHabboInfo().getGamePlayer().getTeamColor());
} }
if (triggered) { this.setExtradata(WiredBlobState.USED.getState());
this.setExtradata("1");
room.updateItem(this); room.updateItem(this);
} }
} }
} }
@Override
public void onClick(GameClient client, Room room, Object[] objects) throws Exception {
if (!this.RESETS_WITH_GAME && objects != null && objects.length == 2 && objects[1].equals(WiredEffectType.TOGGLE_STATE) && room.getGames().stream().anyMatch(game -> game.getState().equals(GameState.RUNNING) || game.getState().equals(GameState.PAUSED))) {
this.setExtradata(this.getExtradata().equals(WiredBlobState.ACTIVE.getState()) ? WiredBlobState.USED.getState() : WiredBlobState.ACTIVE.getState());
room.updateItem(this);
}
}
public void onGameStart(Room room) {
if (this.RESETS_WITH_GAME) {
this.setExtradata(WiredBlobState.ACTIVE.getState());
room.updateItem(this);
}
}
public void onGameEnd(Room room) {
this.setExtradata(WiredBlobState.USED.getState());
room.updateItem(this);
}
private void parseCustomParams() {
String[] params = this.getBaseItem().getCustomParams().split(",");
if (params.length != 2) {
Emulator.getLogging().logErrorLine("Wired blobs should have customparams with two parameters (points,resetsWithGame)");
return;
}
try {
this.POINTS_REWARD = Integer.parseInt(params[0]);
} catch (NumberFormatException e) {
Emulator.getLogging().logErrorLine("Wired blobs should have customparams with the first parameter being the amount of points (number)");
return;
}
this.RESETS_WITH_GAME = params[1].equalsIgnoreCase("true");
} }
} }

View File

@ -14,7 +14,7 @@ import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
public class WiredTriggerHabboUnidle extends InteractionWiredTrigger { public class WiredTriggerHabboUnidle extends InteractionWiredTrigger {
private static final WiredTriggerType type = WiredTriggerType.IDLES; private static final WiredTriggerType type = WiredTriggerType.UNIDLES;
public WiredTriggerHabboUnidle(ResultSet set, Item baseItem) throws SQLException { public WiredTriggerHabboUnidle(ResultSet set, Item baseItem) throws SQLException {
super(set, baseItem); super(set, baseItem);

View File

@ -1,9 +1,11 @@
package com.eu.habbo.habbohotel.items.interactions.wired.triggers; package com.eu.habbo.habbohotel.items.interactions.wired.triggers;
import com.eu.habbo.Emulator;
import com.eu.habbo.habbohotel.items.ICycleable; import com.eu.habbo.habbohotel.items.ICycleable;
import com.eu.habbo.habbohotel.items.Item; import com.eu.habbo.habbohotel.items.Item;
import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect;
import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger;
import com.eu.habbo.habbohotel.items.interactions.wired.WiredTriggerReset;
import com.eu.habbo.habbohotel.rooms.Room; import com.eu.habbo.habbohotel.rooms.Room;
import com.eu.habbo.habbohotel.rooms.RoomUnit; import com.eu.habbo.habbohotel.rooms.RoomUnit;
import com.eu.habbo.habbohotel.wired.WiredHandler; import com.eu.habbo.habbohotel.wired.WiredHandler;
@ -17,9 +19,9 @@ import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class WiredTriggerRepeater extends InteractionWiredTrigger implements ICycleable { public class WiredTriggerRepeater extends InteractionWiredTrigger implements ICycleable, WiredTriggerReset {
public static final WiredTriggerType type = WiredTriggerType.PERIODICALLY; public static final WiredTriggerType type = WiredTriggerType.PERIODICALLY;
public static final int DEFAULT_DELAY = 20 * 500; public static final int DEFAULT_DELAY = 10 * 500;
protected int repeatTime = DEFAULT_DELAY; protected int repeatTime = DEFAULT_DELAY;
protected int counter = 0; protected int counter = 0;
@ -123,4 +125,15 @@ public class WiredTriggerRepeater extends InteractionWiredTrigger implements ICy
} }
} }
} }
@Override
public void resetTimer() {
this.counter = 0;
if (this.getRoomId() != 0) {
Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId());
if (room != null && room.isLoaded()) {
WiredHandler.handle(this, null, room, new Object[]{this});
}
}
}
} }

View File

@ -1,9 +1,11 @@
package com.eu.habbo.habbohotel.items.interactions.wired.triggers; package com.eu.habbo.habbohotel.items.interactions.wired.triggers;
import com.eu.habbo.Emulator;
import com.eu.habbo.habbohotel.items.ICycleable; import com.eu.habbo.habbohotel.items.ICycleable;
import com.eu.habbo.habbohotel.items.Item; import com.eu.habbo.habbohotel.items.Item;
import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect;
import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger;
import com.eu.habbo.habbohotel.items.interactions.wired.WiredTriggerReset;
import com.eu.habbo.habbohotel.rooms.Room; import com.eu.habbo.habbohotel.rooms.Room;
import com.eu.habbo.habbohotel.rooms.RoomUnit; import com.eu.habbo.habbohotel.rooms.RoomUnit;
import com.eu.habbo.habbohotel.wired.WiredHandler; import com.eu.habbo.habbohotel.wired.WiredHandler;
@ -17,8 +19,8 @@ import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class WiredTriggerRepeaterLong extends InteractionWiredTrigger implements ICycleable { public class WiredTriggerRepeaterLong extends InteractionWiredTrigger implements ICycleable, WiredTriggerReset {
public static final int DEFAULT_DELAY = 20 * 5000; public static final int DEFAULT_DELAY = 10 * 5000;
private static final WiredTriggerType type = WiredTriggerType.PERIODICALLY_LONG; private static final WiredTriggerType type = WiredTriggerType.PERIODICALLY_LONG;
private int repeatTime = DEFAULT_DELAY; private int repeatTime = DEFAULT_DELAY;
private int counter = 0; private int counter = 0;
@ -117,4 +119,15 @@ public class WiredTriggerRepeaterLong extends InteractionWiredTrigger implements
} }
} }
} }
@Override
public void resetTimer() {
this.counter = 0;
if (this.getRoomId() != 0) {
Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId());
if (room != null && room.isLoaded()) {
WiredHandler.handle(this, null, room, new Object[]{this});
}
}
}
} }

View File

@ -45,6 +45,15 @@ public class ModToolIssue implements ISerialize {
this.modName = set.getString("mod_username"); this.modName = set.getString("mod_username");
this.type = ModToolTicketType.values()[set.getInt("type") - 1]; this.type = ModToolTicketType.values()[set.getInt("type") - 1];
this.category = set.getInt("category"); this.category = set.getInt("category");
this.groupId = set.getInt("group_id");
this.threadId = set.getInt("thread_id");
this.commentId = set.getInt("comment_id");
int photoItemId = set.getInt("photo_item_id");
if (photoItemId != -1) {
this.photoItem = Emulator.getGameEnvironment().getItemManager().loadHabboItem(photoItemId);;
}
if (this.modId <= 0) { if (this.modId <= 0) {
this.modName = ""; this.modName = "";
@ -79,8 +88,8 @@ public class ModToolIssue implements ISerialize {
message.appendString(this.senderUsername); //Reporter user name. message.appendString(this.senderUsername); //Reporter user name.
message.appendInt(this.reportedId); //Reported user ID. message.appendInt(this.reportedId); //Reported user ID.
message.appendString(this.reportedUsername); //Reported user name. message.appendString(this.reportedUsername); //Reported user name.
message.appendInt(this.modId); //MOD User ID? message.appendInt(this.modId); //ADMIN User ID?
message.appendString(this.modName); //MOD User name? message.appendString(this.modName); //ADMIN User name?
message.appendString(this.message); message.appendString(this.message);
message.appendInt(0); message.appendInt(0);

View File

@ -278,12 +278,12 @@ public class ModToolManager {
return chatlogs; return chatlogs;
} }
public THashSet<ModToolRoomVisit> requestUserRoomVisits(Habbo habbo) { public THashSet<ModToolRoomVisit> getUserRoomVisits(int userId) {
THashSet<ModToolRoomVisit> roomVisits = new THashSet<>(); THashSet<ModToolRoomVisit> roomVisits = new THashSet<>();
try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT rooms.name, room_enter_log.* FROM room_enter_log INNER JOIN rooms ON rooms.id = room_enter_log.room_id WHERE user_id = ? AND timestamp >= ? ORDER BY timestamp DESC LIMIT 50")) { try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT rooms.name, room_enter_log.* FROM room_enter_log INNER JOIN rooms ON rooms.id = room_enter_log.room_id WHERE user_id = ? ORDER BY timestamp DESC LIMIT 50")) {
statement.setInt(1, habbo.getHabboInfo().getId()); statement.setInt(1, userId);
statement.setInt(2, Emulator.getIntUnixTimestamp() - 84600);
try (ResultSet set = statement.executeQuery()) { try (ResultSet set = statement.executeQuery()) {
while (set.next()) { while (set.next()) {
roomVisits.add(new ModToolRoomVisit(set)); roomVisits.add(new ModToolRoomVisit(set));

View File

@ -0,0 +1,25 @@
package com.eu.habbo.habbohotel.modtool;
public class ModToolSanctionItem {
public int id;
public int habboId;
public int sanctionLevel;
public int probationTimestamp;
public boolean isMuted;
public int muteDuration;
public int tradeLockedUntil;
public String reason;
public ModToolSanctionItem(int id, int habboId, int sanctionLevel, int probationTimestamp, boolean isMuted, int muteDuration, int tradeLockedUntil, String reason) {
this.id = id;
this.habboId = habboId;
this.sanctionLevel = sanctionLevel;
this.probationTimestamp = probationTimestamp;
this.isMuted = isMuted;
this.muteDuration = muteDuration;
this.tradeLockedUntil = tradeLockedUntil;
this.reason = reason;
}
}

View File

@ -0,0 +1,15 @@
package com.eu.habbo.habbohotel.modtool;
public class ModToolSanctionLevelItem {
public int sanctionLevel;
public String sanctionType;
public int sanctionHourLength;
public int sanctionProbationDays;
public ModToolSanctionLevelItem(int sanctionLevel, String sanctionType, int sanctionHourLength, int sanctionProbationDays) {
this.sanctionLevel = sanctionLevel;
this.sanctionType = sanctionType;
this.sanctionHourLength = sanctionHourLength;
this.sanctionProbationDays = sanctionProbationDays;
}
}

View File

@ -0,0 +1,173 @@
package com.eu.habbo.habbohotel.modtool;
import com.eu.habbo.Emulator;
import com.eu.habbo.habbohotel.users.Habbo;
import com.eu.habbo.plugin.events.sanctions.SanctionEvent;
import gnu.trove.map.hash.THashMap;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
public class ModToolSanctions {
private final THashMap<Integer, ArrayList<ModToolSanctionItem>> sanctionHashmap;
private final THashMap<Integer, ModToolSanctionLevelItem> sanctionLevelsHashmap;
public ModToolSanctions() {
long millis = System.currentTimeMillis();
this.sanctionHashmap = new THashMap<>();
this.sanctionLevelsHashmap = new THashMap<>();
this.loadModSanctions();
Emulator.getLogging().logStart("Sanctions Manager -> Loaded! (" + (System.currentTimeMillis() - millis) + " MS)");
}
public synchronized void loadModSanctions() {
this.sanctionHashmap.clear();
this.sanctionLevelsHashmap.clear();
this.loadSanctionLevels();
}
private void loadSanctionLevels() {
try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM sanction_levels")) {
try (ResultSet set = statement.executeQuery()) {
while (set.next()) {
this.sanctionLevelsHashmap.put(set.getInt("level"), new ModToolSanctionLevelItem(set.getInt("level"), set.getString("type"), set.getInt("hour_length"), set.getInt("probation_days")));
}
}
} catch (SQLException e) {
Emulator.getLogging().logSQLException(e);
}
}
public ModToolSanctionLevelItem getSanctionLevelItem(int sanctionLevel) {
return this.sanctionLevelsHashmap.get(sanctionLevel);
}
public THashMap<Integer, ArrayList<ModToolSanctionItem>> getSanctions(int habboId) {
synchronized (this.sanctionHashmap) {
this.sanctionHashmap.clear();
try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM sanctions WHERE habbo_id = ? ORDER BY id ASC")) {
statement.setInt(1, habboId);
try (ResultSet set = statement.executeQuery()) {
while (set.next()) {
if (this.sanctionHashmap.get(set.getInt("habbo_id")) == null) {
this.sanctionHashmap.put(set.getInt("habbo_id"), new ArrayList<>());
}
ModToolSanctionItem item = new ModToolSanctionItem(set.getInt("id"), set.getInt("habbo_id"), set.getInt("sanction_level"), set.getInt("probation_timestamp"), set.getBoolean("is_muted"), set.getInt("mute_duration"), set.getInt("trade_locked_until"), set.getString("reason"));
if (!this.sanctionHashmap.get(set.getInt("habbo_id")).contains(item)) {
this.sanctionHashmap.get(set.getInt("habbo_id")).add(item);
}
}
}
} catch (SQLException e) {
Emulator.getLogging().logSQLException(e);
}
return this.sanctionHashmap;
}
}
private void insertSanction(int habboId, int sanctionLevel, int probationTimestamp, String reason, int tradeLockedUntil, boolean isMuted, int muteDuration) {
try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO sanctions (habbo_id, sanction_level, probation_timestamp, reason, trade_locked_until, is_muted, mute_duration) VALUES (?, ?, ?, ?, ?, ?, ?)")) {
statement.setInt(1, habboId);
statement.setInt(2, sanctionLevel);
statement.setInt(3, probationTimestamp);
statement.setString(4, reason);
statement.setInt(5, tradeLockedUntil);
statement.setBoolean(6, isMuted);
statement.setInt(7, muteDuration);
statement.execute();
} catch (SQLException e) {
Emulator.getLogging().logSQLException(e);
}
}
public void updateSanction(int rowId, int probationTimestamp) {
try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE sanctions SET probation_timestamp = ? WHERE id = ?")) {
statement.setInt(1, probationTimestamp);
statement.setInt(2, rowId);
statement.execute();
} catch (SQLException e) {
Emulator.getLogging().logSQLException(e);
}
}
public void updateTradeLockedUntil(int rowId, int tradeLockedUntil) {
try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE sanctions SET trade_locked_until = ? WHERE id = ?")) {
statement.setInt(1, tradeLockedUntil);
statement.setInt(2, rowId);
statement.execute();
} catch (SQLException e) {
Emulator.getLogging().logSQLException(e);
}
}
public void updateMuteDuration(int rowId, int muteDuration) {
try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE sanctions SET mute_duration = ? WHERE id = ?")) {
statement.setInt(1, muteDuration);
statement.setInt(2, rowId);
statement.execute();
} catch (SQLException e) {
Emulator.getLogging().logSQLException(e);
}
}
public void run(int habboId, Habbo self, int sanctionLevel, int cfhTopic, String reason, int tradeLockedUntil, boolean isMuted, int muteDuration) {
sanctionLevel++;
ModToolSanctionLevelItem sanctionLevelItem = getSanctionLevelItem(sanctionLevel);
insertSanction(habboId, sanctionLevel, buildProbationTimestamp(sanctionLevelItem), reason, tradeLockedUntil, isMuted, muteDuration);
runSanctionBasedOnLevel(sanctionLevelItem, habboId, reason, cfhTopic, self, muteDuration);
Emulator.getPluginManager().fireEvent(new SanctionEvent(self, Emulator.getGameEnvironment().getHabboManager().getHabbo(habboId), sanctionLevel));
}
private int buildProbationTimestamp(ModToolSanctionLevelItem sanctionLevelItem) {
return Emulator.getIntUnixTimestamp() + (sanctionLevelItem.sanctionProbationDays * 24 * 60 * 60);
}
public int getProbationDays(ModToolSanctionLevelItem sanctionLevelItem) {
return sanctionLevelItem.sanctionProbationDays;
}
private void runSanctionBasedOnLevel(ModToolSanctionLevelItem sanctionLevelItem, int habboId, String reason, int cfhTopic, Habbo self, int muteDuration) {
Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(habboId);
int muteDurationSeconds = 0;
if (muteDuration > 0) {
Date muteDurationDate = new Date((long) muteDuration * 1000);
long diff = muteDurationDate.getTime() - Emulator.getDate().getTime();
muteDurationSeconds = Math.toIntExact(diff / 1000);
}
switch (sanctionLevelItem.sanctionType) {
case "ALERT": habbo.alert(reason); break;
case "BAN": Emulator.getGameEnvironment().getModToolManager().ban(habboId, self, reason, sanctionLevelItem.sanctionHourLength, ModToolBanType.ACCOUNT, cfhTopic); break;
case "MUTE": habbo.mute(muteDurationSeconds == 0 ? 3600 : muteDurationSeconds, false); break;
default: break;
}
}
public String getSanctionType(ModToolSanctionLevelItem sanctionLevelItem) {
return sanctionLevelItem.sanctionType;
}
public int getTimeOfSanction(ModToolSanctionLevelItem sanctionLevelItem) {
return sanctionLevelItem.sanctionHourLength;
}
}

View File

@ -150,7 +150,7 @@ public class WordFilter {
foundShit = true; foundShit = true;
if (habbo != null && word.muteTime > 0) { if (habbo != null && word.muteTime > 0) {
habbo.mute(word.muteTime); habbo.mute(word.muteTime, false);
} }
} }
} }

View File

@ -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);
}
}

View File

@ -17,6 +17,7 @@ public class HorsePet extends RideablePet {
this.hairStyle = set.getInt("hair_style"); this.hairStyle = set.getInt("hair_style");
this.hasSaddle(set.getString("saddle").equalsIgnoreCase("1")); this.hasSaddle(set.getString("saddle").equalsIgnoreCase("1"));
this.setAnyoneCanRide(set.getString("ride").equalsIgnoreCase("1")); this.setAnyoneCanRide(set.getString("ride").equalsIgnoreCase("1"));
this.setSaddleItemId(set.getInt("saddle_item_id"));
} }
public HorsePet(int type, int race, String color, String name, int userId) { public HorsePet(int type, int race, String color, String name, int userId) {
@ -30,12 +31,13 @@ public class HorsePet extends RideablePet {
@Override @Override
public void run() { public void run() {
if (this.needsUpdate) { if (this.needsUpdate) {
try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE users_pets SET hair_style = ?, hair_color = ?, saddle = ?, ride = ? WHERE id = ?")) { try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE users_pets SET hair_style = ?, hair_color = ?, saddle = ?, ride = ?, saddle_item_id = ? WHERE id = ?")) {
statement.setInt(1, this.hairStyle); statement.setInt(1, this.hairStyle);
statement.setInt(2, this.hairColor); statement.setInt(2, this.hairColor);
statement.setString(3, this.hasSaddle() ? "1" : "0"); statement.setString(3, this.hasSaddle() ? "1" : "0");
statement.setString(4, this.anyoneCanRide() ? "1" : "0"); statement.setString(4, this.anyoneCanRide() ? "1" : "0");
statement.setInt(5, super.getId()); statement.setInt(5, this.getSaddleItemId());
statement.setInt(6, super.getId());
statement.execute(); statement.execute();
} catch (SQLException e) { } catch (SQLException e) {
Emulator.getLogging().logSQLException(e); Emulator.getLogging().logSQLException(e);

View File

@ -2,10 +2,10 @@ package com.eu.habbo.habbohotel.pets;
import com.eu.habbo.Emulator; import com.eu.habbo.Emulator;
import com.eu.habbo.habbohotel.items.Item; import com.eu.habbo.habbohotel.items.Item;
import com.eu.habbo.habbohotel.items.interactions.InteractionNest; import com.eu.habbo.habbohotel.items.interactions.pets.InteractionNest;
import com.eu.habbo.habbohotel.items.interactions.InteractionPetDrink; import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetDrink;
import com.eu.habbo.habbohotel.items.interactions.InteractionPetFood; import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetFood;
import com.eu.habbo.habbohotel.items.interactions.InteractionPetToy; import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetToy;
import com.eu.habbo.habbohotel.users.HabboItem; import com.eu.habbo.habbohotel.users.HabboItem;
import gnu.trove.map.hash.THashMap; import gnu.trove.map.hash.THashMap;
import gnu.trove.set.hash.THashSet; import gnu.trove.set.hash.THashSet;

View File

@ -3,10 +3,10 @@ package com.eu.habbo.habbohotel.pets;
import com.eu.habbo.Emulator; import com.eu.habbo.Emulator;
import com.eu.habbo.habbohotel.gameclients.GameClient; import com.eu.habbo.habbohotel.gameclients.GameClient;
import com.eu.habbo.habbohotel.items.Item; import com.eu.habbo.habbohotel.items.Item;
import com.eu.habbo.habbohotel.items.interactions.InteractionNest; import com.eu.habbo.habbohotel.items.interactions.pets.InteractionNest;
import com.eu.habbo.habbohotel.items.interactions.InteractionPetDrink; import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetDrink;
import com.eu.habbo.habbohotel.items.interactions.InteractionPetFood; import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetFood;
import com.eu.habbo.habbohotel.items.interactions.InteractionPetToy; import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetToy;
import com.eu.habbo.habbohotel.pets.actions.*; import com.eu.habbo.habbohotel.pets.actions.*;
import com.eu.habbo.habbohotel.rooms.Room; import com.eu.habbo.habbohotel.rooms.Room;
import com.eu.habbo.habbohotel.rooms.RoomTile; import com.eu.habbo.habbohotel.rooms.RoomTile;

View File

@ -10,6 +10,7 @@ public class RideablePet extends Pet {
private Habbo rider; private Habbo rider;
private boolean hasSaddle; private boolean hasSaddle;
private boolean anyoneCanRide; private boolean anyoneCanRide;
private int saddleItemId;
public RideablePet(ResultSet set) throws SQLException { public RideablePet(ResultSet set) throws SQLException {
super(set); super(set);
@ -44,4 +45,12 @@ public class RideablePet extends Pet {
public void setRider(Habbo rider) { public void setRider(Habbo rider) {
this.rider = rider; this.rider = rider;
} }
public int getSaddleItemId() {
return saddleItemId;
}
public void setSaddleItemId(int saddleItemId) {
this.saddleItemId = saddleItemId;
}
} }

View File

@ -1,6 +1,6 @@
package com.eu.habbo.habbohotel.pets.actions; package com.eu.habbo.habbohotel.pets.actions;
import com.eu.habbo.habbohotel.items.interactions.InteractionPetBreedingNest; import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetBreedingNest;
import com.eu.habbo.habbohotel.pets.Pet; import com.eu.habbo.habbohotel.pets.Pet;
import com.eu.habbo.habbohotel.pets.PetAction; import com.eu.habbo.habbohotel.pets.PetAction;
import com.eu.habbo.habbohotel.pets.PetTasks; import com.eu.habbo.habbohotel.pets.PetTasks;

View File

@ -19,6 +19,10 @@ import com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.Interaction
import com.eu.habbo.habbohotel.items.interactions.games.freeze.InteractionFreezeExitTile; import com.eu.habbo.habbohotel.items.interactions.games.freeze.InteractionFreezeExitTile;
import com.eu.habbo.habbohotel.items.interactions.games.tag.InteractionTagField; import com.eu.habbo.habbohotel.items.interactions.games.tag.InteractionTagField;
import com.eu.habbo.habbohotel.items.interactions.games.tag.InteractionTagPole; import com.eu.habbo.habbohotel.items.interactions.games.tag.InteractionTagPole;
import com.eu.habbo.habbohotel.items.interactions.pets.InteractionNest;
import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetBreedingNest;
import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetDrink;
import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetFood;
import com.eu.habbo.habbohotel.items.interactions.wired.extra.WiredBlob; import com.eu.habbo.habbohotel.items.interactions.wired.extra.WiredBlob;
import com.eu.habbo.habbohotel.messenger.MessengerBuddy; import com.eu.habbo.habbohotel.messenger.MessengerBuddy;
import com.eu.habbo.habbohotel.permissions.Permission; import com.eu.habbo.habbohotel.permissions.Permission;
@ -26,7 +30,8 @@ import com.eu.habbo.habbohotel.pets.Pet;
import com.eu.habbo.habbohotel.pets.PetManager; import com.eu.habbo.habbohotel.pets.PetManager;
import com.eu.habbo.habbohotel.pets.RideablePet; import com.eu.habbo.habbohotel.pets.RideablePet;
import com.eu.habbo.habbohotel.users.*; import com.eu.habbo.habbohotel.users.*;
import com.eu.habbo.habbohotel.wired.*; import com.eu.habbo.habbohotel.wired.WiredHandler;
import com.eu.habbo.habbohotel.wired.WiredTriggerType;
import com.eu.habbo.messages.ISerialize; import com.eu.habbo.messages.ISerialize;
import com.eu.habbo.messages.ServerMessage; import com.eu.habbo.messages.ServerMessage;
import com.eu.habbo.messages.outgoing.MessageComposer; import com.eu.habbo.messages.outgoing.MessageComposer;
@ -78,6 +83,7 @@ import java.util.List;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
public class Room implements Comparable<Room>, ISerialize, Runnable { public class Room implements Comparable<Room>, ISerialize, Runnable {
public static final Comparator SORT_SCORE = new Comparator() { public static final Comparator SORT_SCORE = new Comparator() {
@ -466,6 +472,7 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
b.getRoomUnit().setRotation(RoomUserRotation.fromValue(this.getLayout().getDoorDirection())); b.getRoomUnit().setRotation(RoomUserRotation.fromValue(this.getLayout().getDoorDirection()));
} else { } else {
b.getRoomUnit().setZ(set.getDouble("z")); b.getRoomUnit().setZ(set.getDouble("z"));
b.getRoomUnit().setPreviousLocationZ(set.getDouble("z"));
b.getRoomUnit().setRotation(RoomUserRotation.values()[set.getInt("rot")]); b.getRoomUnit().setRotation(RoomUserRotation.values()[set.getInt("rot")]);
} }
b.getRoomUnit().setRoomUnitType(RoomUnitType.BOT); b.getRoomUnit().setRoomUnitType(RoomUnitType.BOT);
@ -547,7 +554,7 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
tile.setState(this.calculateTileState(tile)); tile.setState(this.calculateTileState(tile));
} }
this.sendComposer(new UpdateStackHeightComposer(tiles).compose()); this.sendComposer(new UpdateStackHeightComposer(this, tiles).compose());
} }
private RoomTileState calculateTileState(RoomTile tile) { private RoomTileState calculateTileState(RoomTile tile) {
@ -563,6 +570,9 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
HabboItem lowestChair = this.getLowestChair(tile); HabboItem lowestChair = this.getLowestChair(tile);
THashSet<HabboItem> items = this.getItemsAt(tile); THashSet<HabboItem> items = this.getItemsAt(tile);
if (items == null) return RoomTileState.INVALID; if (items == null) return RoomTileState.INVALID;
if (items.stream().anyMatch(i -> i.getBaseItem().allowLay())) return RoomTileState.LAY;
for (HabboItem item : items) { for (HabboItem item : items) {
if (exclude != null && item == exclude) continue; if (exclude != null && item == exclude) continue;
@ -573,10 +583,10 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
if (lowestItem == null || lowestItem.getZ() < item.getZ()) { if (lowestItem == null || lowestItem.getZ() < item.getZ()) {
lowestItem = item; lowestItem = item;
result = this.checkStateForItem(lowestItem); result = this.checkStateForItem(lowestItem, tile);
} else if (lowestItem.getZ() == item.getZ()) { } else if (lowestItem.getZ() == item.getZ()) {
if (result == RoomTileState.OPEN) { if (result == RoomTileState.OPEN) {
result = this.checkStateForItem(item); result = this.checkStateForItem(item, tile);
} }
} }
} }
@ -586,7 +596,7 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
return result; return result;
} }
private RoomTileState checkStateForItem(HabboItem item) { private RoomTileState checkStateForItem(HabboItem item, RoomTile tile) {
RoomTileState result = RoomTileState.BLOCKED; RoomTileState result = RoomTileState.BLOCKED;
if (item.isWalkable()) { if (item.isWalkable()) {
@ -601,6 +611,11 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
result = RoomTileState.LAY; result = RoomTileState.LAY;
} }
RoomTileState overriddenState = item.getOverrideTileState(tile, this);
if (overriddenState != null) {
result = overriddenState;
}
return result; return result;
} }
@ -655,7 +670,7 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
} }
} }
} }
this.sendComposer(new UpdateStackHeightComposer(updatedTiles).compose()); this.sendComposer(new UpdateStackHeightComposer(this, updatedTiles).compose());
this.updateTiles(updatedTiles); this.updateTiles(updatedTiles);
for (RoomTile tile : updatedTiles) { for (RoomTile tile : updatedTiles) {
this.updateHabbosAt(tile.x, tile.y); this.updateHabbosAt(tile.x, tile.y);
@ -719,8 +734,10 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
} }
public void updateHabbosAt(short x, short y) { public void updateHabbosAt(short x, short y) {
THashSet<Habbo> habbos = this.getHabbosAt(x, y); this.updateHabbosAt(x, y, this.getHabbosAt(x, y));
}
public void updateHabbosAt(short x, short y, THashSet<Habbo> habbos) {
HabboItem item = this.getTopItemAt(x, y); HabboItem item = this.getTopItemAt(x, y);
THashSet<RoomUnit> roomUnits = new THashSet<>(); THashSet<RoomUnit> roomUnits = new THashSet<>();
@ -751,7 +768,7 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
} }
} }
private void updateBotsAt(short x, short y) { public void updateBotsAt(short x, short y) {
HabboItem topItem = this.getTopItemAt(x, y); HabboItem topItem = this.getTopItemAt(x, y);
THashSet<RoomUnit> roomUnits = new THashSet<>(); THashSet<RoomUnit> roomUnits = new THashSet<>();
@ -763,7 +780,7 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
bot.getRoomUnit().setPreviousLocationZ(topItem.getZ()); bot.getRoomUnit().setPreviousLocationZ(topItem.getZ());
bot.getRoomUnit().setRotation(RoomUserRotation.fromValue(topItem.getRotation())); bot.getRoomUnit().setRotation(RoomUserRotation.fromValue(topItem.getRotation()));
} else { } else {
bot.getRoomUnit().setZ(topItem.getZ() + topItem.getBaseItem().getHeight()); bot.getRoomUnit().setZ(topItem.getZ() + Item.getCurrentHeight(topItem));
if (topItem.getBaseItem().allowLay()) { if (topItem.getBaseItem().allowLay()) {
bot.getRoomUnit().setStatus(RoomUnitStatus.LAY, (topItem.getZ() + topItem.getBaseItem().getHeight()) + ""); bot.getRoomUnit().setStatus(RoomUnitStatus.LAY, (topItem.getZ() + topItem.getBaseItem().getHeight()) + "");
@ -771,6 +788,7 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
} }
} else { } else {
bot.getRoomUnit().setZ(bot.getRoomUnit().getCurrentLocation().getStackHeight()); bot.getRoomUnit().setZ(bot.getRoomUnit().getCurrentLocation().getStackHeight());
bot.getRoomUnit().setPreviousLocationZ(bot.getRoomUnit().getCurrentLocation().getStackHeight());
} }
roomUnits.add(bot.getRoomUnit()); roomUnits.add(bot.getRoomUnit());
@ -838,10 +856,11 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
return; return;
if (this.loaded) { if (this.loaded) {
try {
if (!this.traxManager.disposed()) { if (!this.traxManager.disposed()) {
this.traxManager.dispose(); this.traxManager.dispose();
} }
try {
this.roomCycleTask.cancel(false); this.roomCycleTask.cancel(false);
this.scheduledTasks.clear(); this.scheduledTasks.clear();
this.scheduledComposers.clear(); this.scheduledComposers.clear();
@ -921,12 +940,16 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
} }
} }
try {
this.wordQuiz = ""; this.wordQuiz = "";
this.yesVotes = 0; this.yesVotes = 0;
this.noVotes = 0; this.noVotes = 0;
this.updateDatabaseUserCount(); this.updateDatabaseUserCount();
this.preLoaded = true; this.preLoaded = true;
this.layout = null; this.layout = null;
} catch (Exception e) {
Emulator.getLogging().logErrorLine(e);
}
} }
Emulator.getPluginManager().fireEvent(new RoomUnloadedEvent(this)); Emulator.getPluginManager().fireEvent(new RoomUnloadedEvent(this));
@ -1457,7 +1480,7 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
} }
} }
} }
}, 500); }, this.getRollerSpeed() == 0 ? 250 : InteractionRoller.DELAY);
} }
} }
@ -1603,7 +1626,6 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
this.dance(unit, DanceType.NONE); this.dance(unit, DanceType.NONE);
//int tileHeight = this.layout.getTile(topItem.getX(), topItem.getY()).z; //int tileHeight = this.layout.getTile(topItem.getX(), topItem.getY()).z;
unit.setStatus(RoomUnitStatus.SIT, (Item.getCurrentHeight(topItem) * 1.0D) + ""); unit.setStatus(RoomUnitStatus.SIT, (Item.getCurrentHeight(topItem) * 1.0D) + "");
unit.setPreviousLocationZ(topItem.getZ());
unit.setZ(topItem.getZ()); unit.setZ(topItem.getZ());
unit.setRotation(RoomUserRotation.values()[topItem.getRotation()]); unit.setRotation(RoomUserRotation.values()[topItem.getRotation()]);
unit.sitUpdate = false; unit.sitUpdate = false;
@ -2095,25 +2117,29 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
return ""; return "";
} }
public void createPromotion(String title, String description) { public void createPromotion(String title, String description, int category) {
this.promoted = true; this.promoted = true;
if (this.promotion == null) { 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 { } else {
this.promotion.setTitle(title); this.promotion.setTitle(title);
this.promotion.setDescription(description); this.promotion.setDescription(description);
this.promotion.setEndTimestamp(Emulator.getIntUnixTimestamp() + (120 * 60)); 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.setInt(1, this.id);
statement.setString(2, title); statement.setString(2, title);
statement.setString(3, description); statement.setString(3, description);
statement.setInt(4, this.promotion.getEndTimestamp()); statement.setInt(4, this.promotion.getEndTimestamp());
statement.setString(5, this.promotion.getTitle()); statement.setInt(5, this.promotion.getStartTimestamp());
statement.setString(6, this.promotion.getDescription()); statement.setInt(6, category);
statement.setInt(7, this.promotion.getEndTimestamp()); 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(); statement.execute();
} catch (SQLException e) { } catch (SQLException e) {
Emulator.getLogging().logSQLException(e); Emulator.getLogging().logSQLException(e);
@ -2359,6 +2385,9 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
} }
public HabboItem getHabboItem(int id) { public HabboItem getHabboItem(int id) {
if (this.roomItems == null || this.roomSpecialTypes == null)
return null; // room not loaded completely
HabboItem item; HabboItem item;
synchronized (this.roomItems) { synchronized (this.roomItems) {
item = this.roomItems.get(id); item = this.roomItems.get(id);
@ -2577,6 +2606,7 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
this.sendComposer(new RoomUserRemoveComposer(habbo.getRoomUnit()).compose()); this.sendComposer(new RoomUserRemoveComposer(habbo.getRoomUnit()).compose());
} }
if (habbo.getRoomUnit().getCurrentLocation() != null) {
HabboItem item = this.getTopItemAt(habbo.getRoomUnit().getX(), habbo.getRoomUnit().getY()); HabboItem item = this.getTopItemAt(habbo.getRoomUnit().getX(), habbo.getRoomUnit().getY());
if (item != null) { if (item != null) {
@ -2586,6 +2616,7 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
Emulator.getLogging().logErrorLine(e); Emulator.getLogging().logErrorLine(e);
} }
} }
}
synchronized (this.roomUnitLock) { synchronized (this.roomUnitLock) {
this.currentHabbos.remove(habbo.getHabboInfo().getId()); this.currentHabbos.remove(habbo.getHabboInfo().getId());
@ -2971,7 +3002,7 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
habbo.getHabboStats().mutedCount++; habbo.getHabboStats().mutedCount++;
timeOut += (timeOut * (int) Math.ceil(Math.pow(habbo.getHabboStats().mutedCount, 2))); timeOut += (timeOut * (int) Math.ceil(Math.pow(habbo.getHabboStats().mutedCount, 2)));
habbo.getHabboStats().chatCounter = 0; habbo.getHabboStats().chatCounter = 0;
habbo.mute(timeOut); habbo.mute(timeOut, true);
} }
public void talk(Habbo habbo, RoomChatMessage roomChatMessage, RoomChatType chatType) { public void talk(Habbo habbo, RoomChatMessage roomChatMessage, RoomChatType chatType) {
@ -3962,6 +3993,18 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
this.sendComposer(new RoomUserStatusComposer(habbo.getRoomUnit()).compose()); this.sendComposer(new RoomUserStatusComposer(habbo.getRoomUnit()).compose());
} }
public void makeStand(Habbo habbo) {
if (habbo.getRoomUnit() == null) return;
HabboItem item = this.getTopItemAt(habbo.getRoomUnit().getX(), habbo.getRoomUnit().getY());
if (item == null || !item.getBaseItem().allowSit() || !item.getBaseItem().allowLay()) {
habbo.getRoomUnit().cmdStand = true;
habbo.getRoomUnit().setBodyRotation(RoomUserRotation.values()[habbo.getRoomUnit().getBodyRotation().getValue() - habbo.getRoomUnit().getBodyRotation().getValue() % 2]);
habbo.getRoomUnit().removeStatus(RoomUnitStatus.SIT);
this.sendComposer(new RoomUserStatusComposer(habbo.getRoomUnit()).compose());
}
}
public void giveEffect(Habbo habbo, int effectId, int duration) { public void giveEffect(Habbo habbo, int effectId, int duration) {
if (this.currentHabbos.containsKey(habbo.getHabboInfo().getId())) { if (this.currentHabbos.containsKey(habbo.getHabboInfo().getId())) {
this.giveEffect(habbo.getRoomUnit(), effectId, duration); this.giveEffect(habbo.getRoomUnit(), effectId, duration);
@ -4089,11 +4132,10 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
if (habbo != null && iterator.value().getUserId() == habbo.getHabboInfo().getId()) if (habbo != null && iterator.value().getUserId() == habbo.getHabboInfo().getId())
continue; continue;
if (userItemsMap.get(iterator.value().getUserId()) == null) { if (iterator.value() instanceof InteractionPostIt)
userItemsMap.put(iterator.value().getUserId(), new THashSet<>()); continue;
}
userItemsMap.get(iterator.value().getUserId()).add(iterator.value()); userItemsMap.computeIfAbsent(iterator.value().getUserId(), k -> new THashSet<>()).add(iterator.value());
} }
} }
@ -4161,6 +4203,11 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
public void idle(Habbo habbo) { public void idle(Habbo habbo) {
habbo.getRoomUnit().setIdle(); habbo.getRoomUnit().setIdle();
if (habbo.getRoomUnit().getDanceType() != DanceType.NONE) {
this.dance(habbo, DanceType.NONE);
}
this.sendComposer(new RoomUnitIdleComposer(habbo.getRoomUnit()).compose()); this.sendComposer(new RoomUnitIdleComposer(habbo.getRoomUnit()).compose());
WiredHandler.handle(WiredTriggerType.IDLES, habbo.getRoomUnit(), this, new Object[]{habbo}); WiredHandler.handle(WiredTriggerType.IDLES, habbo.getRoomUnit(), this, new Object[]{habbo});
} }
@ -4331,6 +4378,8 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
if (!this.layout.fitsOnMap(tile, item.getBaseItem().getWidth(), item.getBaseItem().getLength(), rotation)) if (!this.layout.fitsOnMap(tile, item.getBaseItem().getWidth(), item.getBaseItem().getLength(), rotation))
return FurnitureMovementError.INVALID_MOVE; return FurnitureMovementError.INVALID_MOVE;
if (item instanceof InteractionStackHelper) return FurnitureMovementError.NONE;
THashSet<RoomTile> occupiedTiles = this.layout.getTilesAt(tile, item.getBaseItem().getWidth(), item.getBaseItem().getLength(), rotation); THashSet<RoomTile> occupiedTiles = this.layout.getTilesAt(tile, item.getBaseItem().getWidth(), item.getBaseItem().getLength(), rotation);
for (RoomTile t : occupiedTiles) { for (RoomTile t : occupiedTiles) {
@ -4339,9 +4388,6 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
if (this.hasPetsAt(t.x, t.y)) return FurnitureMovementError.TILE_HAS_PETS; if (this.hasPetsAt(t.x, t.y)) return FurnitureMovementError.TILE_HAS_PETS;
} }
boolean magicTile = item instanceof InteractionStackHelper;
if (!magicTile) {
List<Pair<RoomTile, THashSet<HabboItem>>> tileFurniList = new ArrayList<>(); List<Pair<RoomTile, THashSet<HabboItem>>> tileFurniList = new ArrayList<>();
for (RoomTile t : occupiedTiles) { for (RoomTile t : occupiedTiles) {
tileFurniList.add(Pair.create(t, this.getItemsAt(t))); tileFurniList.add(Pair.create(t, this.getItemsAt(t)));
@ -4355,7 +4401,6 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
if (!item.canStackAt(this, tileFurniList)) { if (!item.canStackAt(this, tileFurniList)) {
return FurnitureMovementError.CANT_STACK; return FurnitureMovementError.CANT_STACK;
} }
}
return FurnitureMovementError.NONE; return FurnitureMovementError.NONE;
} }
@ -4438,8 +4483,12 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
boolean magicTile = item instanceof InteractionStackHelper; boolean magicTile = item instanceof InteractionStackHelper;
Optional<HabboItem> stackHelper = this.getItemsAt(tile).stream().filter(i -> i instanceof InteractionStackHelper).findAny();
//Check if can be placed at new position //Check if can be placed at new position
THashSet<RoomTile> occupiedTiles = this.layout.getTilesAt(tile, item.getBaseItem().getWidth(), item.getBaseItem().getLength(), rotation); THashSet<RoomTile> occupiedTiles = this.layout.getTilesAt(tile, item.getBaseItem().getWidth(), item.getBaseItem().getLength(), rotation);
if (!stackHelper.isPresent()) {
if (topItem != item) { if (topItem != item) {
for (RoomTile t : occupiedTiles) { for (RoomTile t : occupiedTiles) {
HabboItem tileTopItem = this.getTopItemAt(t.x, t.y); HabboItem tileTopItem = this.getTopItemAt(t.x, t.y);
@ -4459,6 +4508,7 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
if (!magicTile && !item.canStackAt(this, tileFurniList)) { if (!magicTile && !item.canStackAt(this, tileFurniList)) {
return FurnitureMovementError.CANT_STACK; return FurnitureMovementError.CANT_STACK;
} }
}
THashSet<RoomTile> oldOccupiedTiles = this.layout.getTilesAt(this.layout.getTile(item.getX(), item.getY()), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), item.getRotation()); THashSet<RoomTile> oldOccupiedTiles = this.layout.getTilesAt(this.layout.getTile(item.getX(), item.getY()), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), item.getRotation());
@ -4477,8 +4527,19 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
} }
} }
//Place at new position //Place at new position
double height = this.getStackHeight(tile.x, tile.y, false, item);
double height;
if (stackHelper.isPresent()) {
height = stackHelper.get().getExtradata().isEmpty() ? Double.valueOf("0.0") : (Double.valueOf(stackHelper.get().getExtradata()) / 100);
} else if (item.equals(topItem) && tile.x == item.getX() && tile.y == item.getY()) {
height = item.getZ();
} else {
height = this.getStackHeight(tile.x, tile.y, false, item);
}
if(height > 40d) return FurnitureMovementError.CANT_STACK; if(height > 40d) return FurnitureMovementError.CANT_STACK;
item.setX(tile.x); item.setX(tile.x);
item.setY(tile.y); item.setY(tile.y);
item.setZ(height); item.setZ(height);
@ -4504,7 +4565,14 @@ public class Room implements Comparable<Room>, ISerialize, Runnable {
//Update Habbos at old position //Update Habbos at old position
for (RoomTile t : occupiedTiles) { for (RoomTile t : occupiedTiles) {
this.updateHabbosAt(t.x, t.y); this.updateHabbosAt(
t.x,
t.y,
this.getHabbosAt(t.x, t.y)
.stream()
.filter(h -> !h.getRoomUnit().hasStatus(RoomUnitStatus.MOVE))
.collect(Collectors.toCollection(THashSet::new))
);
this.updateBotsAt(t.x, t.y); this.updateBotsAt(t.x, t.y);
} }
return FurnitureMovementError.NONE; return FurnitureMovementError.NONE;

View File

@ -210,7 +210,7 @@ public class RoomChatMessage implements Runnable, ISerialize, Loggable {
return; return;
} }
} else { } else {
this.habbo.mute(Emulator.getConfig().getInt("hotel.wordfilter.automute")); this.habbo.mute(Emulator.getConfig().getInt("hotel.wordfilter.automute"), false);
} }
this.message = ""; this.message = "";

View File

@ -257,25 +257,32 @@ public class RoomLayout {
return this.heightmap.replace("\r\n", "\r"); return this.heightmap.replace("\r\n", "\r");
}//re }//re
/// Pathfinder Reworked By Quadral, thanks buddy!! You Saved Morningstar <3
public final Deque<RoomTile> findPath(RoomTile oldTile, RoomTile newTile, RoomTile goalLocation, RoomUnit roomUnit) { public final Deque<RoomTile> findPath(RoomTile oldTile, RoomTile newTile, RoomTile goalLocation, RoomUnit roomUnit) {
return this.findPath(oldTile, newTile, goalLocation, roomUnit, false);
}
/// Pathfinder Reworked By Quadral, thanks buddy!! You Saved Morningstar <3
public final Deque<RoomTile> findPath(RoomTile oldTile, RoomTile newTile, RoomTile goalLocation, RoomUnit roomUnit, boolean isWalktroughRetry) {
if (this.room == null || !this.room.isLoaded() || oldTile == null || newTile == null || oldTile.equals(newTile) || newTile.state == RoomTileState.INVALID) if (this.room == null || !this.room.isLoaded() || oldTile == null || newTile == null || oldTile.equals(newTile) || newTile.state == RoomTileState.INVALID)
return new LinkedList<>(); return new LinkedList<>();
LinkedList<RoomTile> openList = new LinkedList<>(); LinkedList<RoomTile> openList = new LinkedList<>();
List<RoomTile> closedList = new LinkedList<>(); List<RoomTile> closedList = new LinkedList<>();
RoomTile current;
openList.add(oldTile.copy()); openList.add(oldTile.copy());
while (!openList.isEmpty()) {
current = this.lowestFInOpen(openList);
if ((current.x == newTile.x) && (current.y == newTile.y)) {
return this.calcPath(this.findTile(openList, oldTile.x, oldTile.y), current);
while (!openList.isEmpty()) {
RoomTile current = this.lowestFInOpen(openList);
if (current.x == newTile.x && current.y == newTile.y) {
return this.calcPath(this.findTile(openList, oldTile.x, oldTile.y), current);
} }
closedList.add(current); closedList.add(current);
openList.remove(current); openList.remove(current);
List<RoomTile> adjacentNodes = this.getAdjacent(openList, current, newTile);
List<RoomTile> adjacentNodes = this.getAdjacent(openList, current, newTile, roomUnit);
for (RoomTile currentAdj : adjacentNodes) { for (RoomTile currentAdj : adjacentNodes) {
if (closedList.contains(currentAdj)) continue; if (closedList.contains(currentAdj)) continue;
if (roomUnit.canOverrideTile(currentAdj) || (currentAdj.state != RoomTileState.BLOCKED && currentAdj.x == doorX && currentAdj.y == doorY)) { if (roomUnit.canOverrideTile(currentAdj) || (currentAdj.state != RoomTileState.BLOCKED && currentAdj.x == doorX && currentAdj.y == doorY)) {
currentAdj.setPrevious(current); currentAdj.setPrevious(current);
currentAdj.sethCosts(this.findTile(openList, newTile.x, newTile.y)); currentAdj.sethCosts(this.findTile(openList, newTile.x, newTile.y));
@ -283,19 +290,23 @@ public class RoomLayout {
openList.add(currentAdj); openList.add(currentAdj);
continue; continue;
} }
if ((currentAdj.state == RoomTileState.BLOCKED) || ((currentAdj.state == RoomTileState.SIT || currentAdj.state == RoomTileState.LAY) && !currentAdj.equals(goalLocation))) {
if (currentAdj.state == RoomTileState.BLOCKED || ((currentAdj.state == RoomTileState.SIT || currentAdj.state == RoomTileState.LAY) && !currentAdj.equals(goalLocation))) {
closedList.add(currentAdj); closedList.add(currentAdj);
openList.remove(currentAdj); openList.remove(currentAdj);
continue; continue;
} }
double height = currentAdj.getStackHeight() - current.getStackHeight(); double height = currentAdj.getStackHeight() - current.getStackHeight();
if (!ALLOW_FALLING && height < -MAXIMUM_STEP_HEIGHT) continue; if (!ALLOW_FALLING && height < -MAXIMUM_STEP_HEIGHT) continue;
if (currentAdj.state == RoomTileState.OPEN && height > MAXIMUM_STEP_HEIGHT) continue; if (currentAdj.state == RoomTileState.OPEN && height > MAXIMUM_STEP_HEIGHT) continue;
if (currentAdj.hasUnits() && (!this.room.isAllowWalkthrough() || currentAdj.equals(goalLocation))) {
if (currentAdj.hasUnits() && ((!isWalktroughRetry && !this.room.isAllowWalkthrough()) || currentAdj.equals(goalLocation))) {
closedList.add(currentAdj); closedList.add(currentAdj);
openList.remove(currentAdj); openList.remove(currentAdj);
continue; continue;
} }
if (!openList.contains(currentAdj)) { if (!openList.contains(currentAdj)) {
currentAdj.setPrevious(current); currentAdj.setPrevious(current);
currentAdj.sethCosts(this.findTile(openList, newTile.x, newTile.y)); currentAdj.sethCosts(this.findTile(openList, newTile.x, newTile.y));
@ -307,8 +318,12 @@ public class RoomLayout {
} }
} }
} }
// System.out.println("Invalid Path.");
return new LinkedList<>(); if (!this.room.isAllowWalkthrough() && !isWalktroughRetry) {
return this.findPath(oldTile, newTile, goalLocation, roomUnit, true);
}
return null;
} }
private RoomTile findTile(List<RoomTile> tiles, short x, short y) { private RoomTile findTile(List<RoomTile> tiles, short x, short y) {
@ -326,7 +341,7 @@ public class RoomLayout {
return null; return null;
} }
private Deque<RoomTile> calcPath(RoomTile start, RoomTile goal) { public Deque<RoomTile> calcPath(RoomTile start, RoomTile goal) {
LinkedList<RoomTile> path = new LinkedList<>(); LinkedList<RoomTile> path = new LinkedList<>();
if (start == null) if (start == null)
return path; return path;
@ -355,13 +370,13 @@ public class RoomLayout {
return cheapest; return cheapest;
} }
private List<RoomTile> getAdjacent(List<RoomTile> openList, RoomTile node, RoomTile nextTile) { private List<RoomTile> getAdjacent(List<RoomTile> openList, RoomTile node, RoomTile nextTile, RoomUnit unit) {
short x = node.x; short x = node.x;
short y = node.y; short y = node.y;
List<RoomTile> adj = new LinkedList<>(); List<RoomTile> adj = new LinkedList<>();
if (x > 0) { if (x > 0) {
RoomTile temp = this.findTile(openList, (short) (x - 1), y); RoomTile temp = this.findTile(openList, (short) (x - 1), y);
if (temp != null && temp.state != RoomTileState.BLOCKED && temp.state != RoomTileState.INVALID) { if (this.canWalkOn(temp, unit)) {
if (temp.state != RoomTileState.SIT || nextTile.getStackHeight() - node.getStackHeight() <= 2.0) { if (temp.state != RoomTileState.SIT || nextTile.getStackHeight() - node.getStackHeight() <= 2.0) {
temp.isDiagonally(false); temp.isDiagonally(false);
if (!adj.contains(temp)) if (!adj.contains(temp))
@ -371,7 +386,7 @@ public class RoomLayout {
} }
if (x < this.mapSizeX) { if (x < this.mapSizeX) {
RoomTile temp = this.findTile(openList, (short) (x + 1), y); RoomTile temp = this.findTile(openList, (short) (x + 1), y);
if (temp != null && temp.state != RoomTileState.BLOCKED && temp.state != RoomTileState.INVALID) { if (this.canWalkOn(temp, unit)) {
if (temp.state != RoomTileState.SIT || nextTile.getStackHeight() - node.getStackHeight() <= 2.0) { if (temp.state != RoomTileState.SIT || nextTile.getStackHeight() - node.getStackHeight() <= 2.0) {
temp.isDiagonally(false); temp.isDiagonally(false);
if (!adj.contains(temp)) if (!adj.contains(temp))
@ -381,7 +396,7 @@ public class RoomLayout {
} }
if (y > 0) { if (y > 0) {
RoomTile temp = this.findTile(openList, x, (short) (y - 1)); RoomTile temp = this.findTile(openList, x, (short) (y - 1));
if (temp != null && temp.state != RoomTileState.BLOCKED && temp.state != RoomTileState.INVALID) { if (this.canWalkOn(temp, unit)) {
if (temp.state != RoomTileState.SIT || nextTile.getStackHeight() - node.getStackHeight() <= 2.0) { if (temp.state != RoomTileState.SIT || nextTile.getStackHeight() - node.getStackHeight() <= 2.0) {
temp.isDiagonally(false); temp.isDiagonally(false);
if (!adj.contains(temp)) if (!adj.contains(temp))
@ -391,7 +406,7 @@ public class RoomLayout {
} }
if (y < this.mapSizeY) { if (y < this.mapSizeY) {
RoomTile temp = this.findTile(openList, x, (short) (y + 1)); RoomTile temp = this.findTile(openList, x, (short) (y + 1));
if (temp != null && temp.state != RoomTileState.BLOCKED && temp.state != RoomTileState.INVALID) { if (this.canWalkOn(temp, unit)) {
if (temp.state != RoomTileState.SIT || nextTile.getStackHeight() - node.getStackHeight() <= 2.0) { if (temp.state != RoomTileState.SIT || nextTile.getStackHeight() - node.getStackHeight() <= 2.0) {
temp.isDiagonally(false); temp.isDiagonally(false);
if (!adj.contains(temp)) if (!adj.contains(temp))
@ -405,7 +420,7 @@ public class RoomLayout {
RoomTile offY = this.findTile(openList, x, (short) (y + 1)); RoomTile offY = this.findTile(openList, x, (short) (y + 1));
if (offX != null && offY != null && (offX.isWalkable() || offY.isWalkable())) { if (offX != null && offY != null && (offX.isWalkable() || offY.isWalkable())) {
RoomTile temp = this.findTile(openList, (short) (x + 1), (short) (y + 1)); RoomTile temp = this.findTile(openList, (short) (x + 1), (short) (y + 1));
if (temp != null && temp.state != RoomTileState.BLOCKED && temp.state != RoomTileState.INVALID) { if (this.canWalkOn(temp, unit)) {
if (temp.state != RoomTileState.SIT || nextTile.getStackHeight() - node.getStackHeight() <= 2.0) { if (temp.state != RoomTileState.SIT || nextTile.getStackHeight() - node.getStackHeight() <= 2.0) {
temp.isDiagonally(true); temp.isDiagonally(true);
if (!adj.contains(temp)) if (!adj.contains(temp))
@ -419,7 +434,7 @@ public class RoomLayout {
RoomTile offY = this.findTile(openList, x, (short) (y - 1)); RoomTile offY = this.findTile(openList, x, (short) (y - 1));
if (offX != null && offY != null && (offX.isWalkable() || offY.isWalkable())) { if (offX != null && offY != null && (offX.isWalkable() || offY.isWalkable())) {
RoomTile temp = this.findTile(openList, (short) (x - 1), (short) (y - 1)); RoomTile temp = this.findTile(openList, (short) (x - 1), (short) (y - 1));
if (temp != null && temp.state != RoomTileState.BLOCKED && temp.state != RoomTileState.INVALID) { if (this.canWalkOn(temp, unit)) {
if (temp.state != RoomTileState.SIT || nextTile.getStackHeight() - node.getStackHeight() <= 2.0) { if (temp.state != RoomTileState.SIT || nextTile.getStackHeight() - node.getStackHeight() <= 2.0) {
temp.isDiagonally(true); temp.isDiagonally(true);
if (!adj.contains(temp)) if (!adj.contains(temp))
@ -433,7 +448,7 @@ public class RoomLayout {
RoomTile offY = this.findTile(openList, x, (short) (y + 1)); RoomTile offY = this.findTile(openList, x, (short) (y + 1));
if (offX != null && offY != null && (offX.isWalkable() || offY.isWalkable())) { if (offX != null && offY != null && (offX.isWalkable() || offY.isWalkable())) {
RoomTile temp = this.findTile(openList, (short) (x - 1), (short) (y + 1)); RoomTile temp = this.findTile(openList, (short) (x - 1), (short) (y + 1));
if (temp != null && temp.state != RoomTileState.BLOCKED && temp.state != RoomTileState.INVALID) { if (this.canWalkOn(temp, unit)) {
if (temp.state != RoomTileState.SIT || nextTile.getStackHeight() - node.getStackHeight() <= 2.0) { if (temp.state != RoomTileState.SIT || nextTile.getStackHeight() - node.getStackHeight() <= 2.0) {
temp.isDiagonally(true); temp.isDiagonally(true);
if (!adj.contains(temp)) if (!adj.contains(temp))
@ -447,7 +462,7 @@ public class RoomLayout {
RoomTile offY = this.findTile(openList, x, (short) (y - 1)); RoomTile offY = this.findTile(openList, x, (short) (y - 1));
if (offX != null && offY != null && (offX.isWalkable() || offY.isWalkable())) { if (offX != null && offY != null && (offX.isWalkable() || offY.isWalkable())) {
RoomTile temp = this.findTile(openList, (short) (x + 1), (short) (y - 1)); RoomTile temp = this.findTile(openList, (short) (x + 1), (short) (y - 1));
if (temp != null && temp.state != RoomTileState.BLOCKED && temp.state != RoomTileState.INVALID) { if (this.canWalkOn(temp, unit)) {
if (temp.state != RoomTileState.SIT || nextTile.getStackHeight() - node.getStackHeight() <= 2.0) { if (temp.state != RoomTileState.SIT || nextTile.getStackHeight() - node.getStackHeight() <= 2.0) {
temp.isDiagonally(true); temp.isDiagonally(true);
if (!adj.contains(temp)) if (!adj.contains(temp))
@ -460,6 +475,10 @@ public class RoomLayout {
return adj; return adj;
} }
private boolean canWalkOn(RoomTile tile, RoomUnit unit) {
return tile != null && (unit.canOverrideTile(tile) || (tile.state != RoomTileState.BLOCKED && tile.state != RoomTileState.INVALID));
}
public void moveDiagonally(boolean value) { public void moveDiagonally(boolean value) {
this.CANMOVEDIAGONALY = value; this.CANMOVEDIAGONALY = value;
} }
@ -536,10 +555,14 @@ public class RoomLayout {
} }
public List<RoomTile> getTilesAround(RoomTile tile, int directionOffset) { public List<RoomTile> getTilesAround(RoomTile tile, int directionOffset) {
List<RoomTile> tiles = new ArrayList<>(8); return getTilesAround(tile, directionOffset, true);
}
public List<RoomTile> getTilesAround(RoomTile tile, int directionOffset, boolean diagonal) {
List<RoomTile> tiles = new ArrayList<>(diagonal ? 8 : 4);
if (tile != null) { if (tile != null) {
for (int i = 0; i < 8; i++) { for (int i = 0; i < 8; i += (diagonal ? 1 : 2)) {
RoomTile t = this.getTileInFront(tile, (i + directionOffset) % 8); RoomTile t = this.getTileInFront(tile, (i + directionOffset) % 8);
if (t != null) { if (t != null) {
tiles.add(t); tiles.add(t);

View File

@ -596,7 +596,7 @@ public class RoomManager {
habbo.getRoomUnit().clearStatus(); habbo.getRoomUnit().clearStatus();
if (habbo.getRoomUnit().getCurrentLocation() == null) { if (habbo.getRoomUnit().getCurrentLocation() == null) {
habbo.getRoomUnit().setLocation(doorLocation != null ? doorLocation : room.getLayout().getDoorTile()); habbo.getRoomUnit().setLocation(doorLocation != null ? doorLocation : room.getLayout().getDoorTile());
habbo.getRoomUnit().setZ(habbo.getRoomUnit().getCurrentLocation().getStackHeight()); if (habbo.getRoomUnit().getCurrentLocation() != null) habbo.getRoomUnit().setZ(habbo.getRoomUnit().getCurrentLocation().getStackHeight());
if (doorLocation == null) { if (doorLocation == null) {
habbo.getRoomUnit().setBodyRotation(RoomUserRotation.values()[room.getLayout().getDoorDirection()]); habbo.getRoomUnit().setBodyRotation(RoomUserRotation.values()[room.getLayout().getDoorDirection()]);
@ -713,21 +713,23 @@ public class RoomManager {
if (!room.getCurrentHabbos().isEmpty()) { if (!room.getCurrentHabbos().isEmpty()) {
Collection<Habbo> habbosToSendEnter = room.getCurrentHabbos().values(); Collection<Habbo> habbosToSendEnter = room.getCurrentHabbos().values();
Collection<Habbo> visibleHabbos = room.getHabbos();
if (Emulator.getPluginManager().isRegistered(HabboAddedToRoomEvent.class, false)) { if (Emulator.getPluginManager().isRegistered(HabboAddedToRoomEvent.class, false)) {
HabboAddedToRoomEvent event = Emulator.getPluginManager().fireEvent(new HabboAddedToRoomEvent(habbo, room, habbosToSendEnter)); HabboAddedToRoomEvent event = Emulator.getPluginManager().fireEvent(new HabboAddedToRoomEvent(habbo, room, habbosToSendEnter, visibleHabbos));
habbosToSendEnter = event.habbosToSendEnter; habbosToSendEnter = event.habbosToSendEnter;
visibleHabbos = event.visibleHabbos;
} }
for (Habbo habboToSendEnter : habbosToSendEnter) { for (Habbo habboToSendEnter : habbosToSendEnter) {
GameClient client = habboToSendEnter.getClient(); GameClient client = habboToSendEnter.getClient();
if (client != null) { if (client != null) {
client.sendResponse(new RoomUsersComposer(habbo).compose()); client.sendResponse(new RoomUsersComposer(habbo).compose());
habboToSendEnter.getClient().sendResponse(new RoomUserStatusComposer(habbo.getRoomUnit()).compose()); client.sendResponse(new RoomUserStatusComposer(habbo.getRoomUnit()).compose());
} }
} }
for (Habbo h : room.getHabbos()) { for (Habbo h : visibleHabbos) {
if (!h.getRoomUnit().isInvisible()) { if (!h.getRoomUnit().isInvisible()) {
habbos.add(h); habbos.add(h);
} }
@ -747,11 +749,6 @@ public class RoomManager {
} }
int effect = habbo.getInventory().getEffectsComponent().activatedEffect; int effect = habbo.getInventory().getEffectsComponent().activatedEffect;
if (effect == 0) {
effect = habbo.getHabboInfo().getRank().getRoomEffect();
}
room.giveEffect(habbo.getRoomUnit(), effect, -1); room.giveEffect(habbo.getRoomUnit(), effect, -1);
} }
@ -770,7 +767,7 @@ public class RoomManager {
habbo.getClient().sendResponse(new RoomUserDanceComposer(bot.getRoomUnit())); habbo.getClient().sendResponse(new RoomUserDanceComposer(bot.getRoomUnit()));
} }
habbo.getClient().sendResponse(new RoomUserStatusComposer(bot.getRoomUnit())); habbo.getClient().sendResponse(new RoomUserStatusComposer(bot.getRoomUnit(), bot.getRoomUnit().getZ()));
} }
} }

View File

@ -13,12 +13,16 @@ public class RoomPromotion {
private String title; private String title;
private String description; private String description;
private int endTimestamp; 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.room = room;
this.title = title; this.title = title;
this.description = description; this.description = description;
this.endTimestamp = endTimestamp; this.endTimestamp = endTimestamp;
this.startTimestamp = startTimestamp;
this.category = category;
} }
public RoomPromotion(Room room, ResultSet set) throws SQLException { public RoomPromotion(Room room, ResultSet set) throws SQLException {
@ -26,14 +30,17 @@ public class RoomPromotion {
this.title = set.getString("title"); this.title = set.getString("title");
this.description = set.getString("description"); this.description = set.getString("description");
this.endTimestamp = set.getInt("end_timestamp"); this.endTimestamp = set.getInt("end_timestamp");
this.startTimestamp = set.getInt("start_timestamp");
this.category = set.getInt("category");
} }
public void save() { public void save() {
if (this.needsUpdate) { 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(1, this.title);
statement.setString(2, this.description); statement.setString(2, this.description);
statement.setInt(3, this.room.getId()); statement.setInt(3, this.category);
statement.setInt(4, this.room.getId());
statement.executeUpdate(); statement.executeUpdate();
} catch (SQLException e) { } catch (SQLException e) {
Emulator.getLogging().logSQLException(e); Emulator.getLogging().logSQLException(e);
@ -74,4 +81,20 @@ public class RoomPromotion {
public void addEndTimestamp(int time) { public void addEndTimestamp(int time) {
this.endTimestamp += 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;
}
} }

View File

@ -15,6 +15,10 @@ import com.eu.habbo.habbohotel.items.interactions.games.football.scoreboards.Int
import com.eu.habbo.habbohotel.items.interactions.games.freeze.InteractionFreezeExitTile; import com.eu.habbo.habbohotel.items.interactions.games.freeze.InteractionFreezeExitTile;
import com.eu.habbo.habbohotel.items.interactions.games.freeze.gates.InteractionFreezeGate; import com.eu.habbo.habbohotel.items.interactions.games.freeze.gates.InteractionFreezeGate;
import com.eu.habbo.habbohotel.items.interactions.games.freeze.scoreboards.InteractionFreezeScoreboard; import com.eu.habbo.habbohotel.items.interactions.games.freeze.scoreboards.InteractionFreezeScoreboard;
import com.eu.habbo.habbohotel.items.interactions.pets.InteractionNest;
import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetDrink;
import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetFood;
import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetToy;
import com.eu.habbo.habbohotel.users.HabboItem; import com.eu.habbo.habbohotel.users.HabboItem;
import com.eu.habbo.habbohotel.wired.WiredConditionType; import com.eu.habbo.habbohotel.wired.WiredConditionType;
import com.eu.habbo.habbohotel.wired.WiredEffectType; import com.eu.habbo.habbohotel.wired.WiredEffectType;

View File

@ -1,8 +1,12 @@
package com.eu.habbo.habbohotel.rooms; package com.eu.habbo.habbohotel.rooms;
import com.eu.habbo.Emulator; 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.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.Pet;
import com.eu.habbo.habbohotel.pets.RideablePet; import com.eu.habbo.habbohotel.pets.RideablePet;
import com.eu.habbo.habbohotel.users.DanceType; import com.eu.habbo.habbohotel.users.DanceType;
@ -21,18 +25,20 @@ import gnu.trove.map.TMap;
import gnu.trove.map.hash.THashMap; import gnu.trove.map.hash.THashMap;
import gnu.trove.set.hash.THashSet; import gnu.trove.set.hash.THashSet;
import java.util.Deque; import java.util.*;
import java.util.LinkedList;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;
import java.util.stream.Collectors;
public class RoomUnit { public class RoomUnit {
public boolean isWiredTeleporting = false;
private final ConcurrentHashMap<RoomUnitStatus, String> status; private final ConcurrentHashMap<RoomUnitStatus, String> status;
private final THashMap<String, Object> cacheable; private final THashMap<String, Object> cacheable;
public boolean canRotate = true; public boolean canRotate = true;
public boolean animateWalk = false; public boolean animateWalk = false;
public boolean cmdTeleport = false; public boolean cmdTeleport = false;
public boolean cmdSit = false; public boolean cmdSit = false;
public boolean cmdStand = false;
public boolean cmdLay = false; public boolean cmdLay = false;
public boolean sitUpdate = false; public boolean sitUpdate = false;
public boolean isTeleporting = false; public boolean isTeleporting = false;
@ -63,6 +69,7 @@ public class RoomUnit {
private int walkTimeOut; private int walkTimeOut;
private int effectId; private int effectId;
private int effectEndTimestamp; private int effectEndTimestamp;
private ScheduledFuture moveBlockingTask;
private int idleTimer; private int idleTimer;
private Room room; private Room room;
@ -173,6 +180,9 @@ public class RoomUnit {
} }
Deque<RoomTile> peekPath = room.getLayout().findPath(this.currentLocation, this.path.peek(), this.goalLocation, this); Deque<RoomTile> peekPath = room.getLayout().findPath(this.currentLocation, this.path.peek(), this.goalLocation, this);
if (peekPath == null) peekPath = new LinkedList<>();
if (peekPath.size() >= 3) { if (peekPath.size() >= 3) {
if (path.isEmpty()) return true; if (path.isEmpty()) return true;
@ -282,7 +292,7 @@ public class RoomUnit {
if (item != null) { if (item != null) {
if (item != habboItem || !RoomLayout.pointInSquare(item.getX(), item.getY(), item.getX() + item.getBaseItem().getWidth() - 1, item.getY() + item.getBaseItem().getLength() - 1, this.getX(), this.getY())) { if (item != habboItem || !RoomLayout.pointInSquare(item.getX(), item.getY(), item.getX() + item.getBaseItem().getWidth() - 1, item.getY() + item.getBaseItem().getLength() - 1, this.getX(), this.getY())) {
if (item.canWalkOn(this, room, null)) { if (item.canWalkOn(this, room, null)) {
item.onWalkOn(this, room, null); item.onWalkOn(this, room, new Object[]{this.getCurrentLocation(), next});
} else if (item instanceof InteractionGuildGate || item instanceof InteractionHabboClubGate) { } else if (item instanceof InteractionGuildGate || item instanceof InteractionHabboClubGate) {
this.setRotation(oldRotation); this.setRotation(oldRotation);
this.tilesWalked--; this.tilesWalked--;
@ -297,7 +307,7 @@ public class RoomUnit {
return false; return false;
} }
} else { } else {
item.onWalk(this, room, null); item.onWalk(this, room, new Object[]{this.getCurrentLocation(), next});
} }
zHeight += item.getZ(); zHeight += item.getZ();
@ -391,6 +401,13 @@ public class RoomUnit {
public void setZ(double z) { public void setZ(double z) {
this.z = z; this.z = z;
if (this.room != null) {
Bot bot = this.room.getBot(this);
if (bot != null) {
bot.needsUpdate(true);
}
}
} }
public boolean isInRoom() { public boolean isInRoom() {
@ -532,10 +549,9 @@ public class RoomUnit {
public void findPath() public void findPath()
{ {
if (this.room != null && this.room.getLayout() != null && this.goalLocation != null && (this.goalLocation.isWalkable() || this.room.canSitOrLayAt(this.goalLocation.x, this.goalLocation.y) || this.canOverrideTile(this.goalLocation))) if (this.room != null && this.room.getLayout() != null && this.goalLocation != null && (this.goalLocation.isWalkable() || this.room.canSitOrLayAt(this.goalLocation.x, this.goalLocation.y) || this.canOverrideTile(this.goalLocation))) {
{ Deque<RoomTile> path = this.room.getLayout().findPath(this.currentLocation, this.goalLocation, this.goalLocation, this);
if (path != null) this.path = path;
this.path = this.room.getLayout().findPath(this.currentLocation, this.goalLocation, this.goalLocation, this);
} }
} }
@ -700,6 +716,9 @@ public class RoomUnit {
public boolean canOverrideTile(RoomTile tile) { public boolean canOverrideTile(RoomTile tile) {
if (tile == null || room == null || room.getLayout() == null) return false; if (tile == null || room == null || room.getLayout() == null) return false;
if (room.getItemsAt(tile).stream().anyMatch(i -> i.canOverrideTile(this, room, tile)))
return true;
int tileIndex = (room.getLayout().getMapSizeY() * tile.y) + tile.x + 1; int tileIndex = (room.getLayout().getMapSizeY() * tile.y) + tile.x + 1;
return this.overridableTiles.contains(tileIndex); return this.overridableTiles.contains(tileIndex);
} }
@ -712,6 +731,8 @@ public class RoomUnit {
} }
public void removeOverrideTile(RoomTile tile) { public void removeOverrideTile(RoomTile tile) {
if (room == null || room.getLayout() == null) return;
int tileIndex = (room.getLayout().getMapSizeY() * tile.y) + tile.x + 1; int tileIndex = (room.getLayout().getMapSizeY() * tile.y) + tile.x + 1;
this.overridableTiles.remove(tileIndex); this.overridableTiles.remove(tileIndex);
} }
@ -735,4 +756,44 @@ public class RoomUnit {
return topItem == null || (!(topItem instanceof InteractionWater) && !(topItem instanceof InteractionWaterItem)); return topItem == null || (!(topItem instanceof InteractionWater) && !(topItem instanceof InteractionWaterItem));
} }
public RoomTile getClosestTile(List<RoomTile> tiles) {
return tiles.stream().min(Comparator.comparingDouble(a -> a.distance(this.getCurrentLocation()))).orElse(null);
}
public RoomTile getClosestAdjacentTile(short x, short y, boolean diagonal) {
if(room == null) return null;
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 this.getClosestTile(
rotations.stream()
.map(rotation -> room.getLayout().getTileInFront(baseTile, rotation))
.filter(t -> t != null && t.isWalkable() && (this.getCurrentLocation().equals(t) || !room.hasHabbosAt(t.x, t.y)))
.collect(Collectors.toList())
);
}
public ScheduledFuture getMoveBlockingTask() {
return moveBlockingTask;
}
public void setMoveBlockingTask(ScheduledFuture moveBlockingTask) {
this.moveBlockingTask = moveBlockingTask;
}
} }

View File

@ -3,11 +3,15 @@ package com.eu.habbo.habbohotel.rooms;
import com.eu.habbo.Emulator; import com.eu.habbo.Emulator;
import com.eu.habbo.core.Disposable; import com.eu.habbo.core.Disposable;
import com.eu.habbo.habbohotel.achievements.AchievementManager; import com.eu.habbo.habbohotel.achievements.AchievementManager;
import com.eu.habbo.habbohotel.gameclients.GameClient;
import com.eu.habbo.habbohotel.items.SoundTrack; import com.eu.habbo.habbohotel.items.SoundTrack;
import com.eu.habbo.habbohotel.items.interactions.InteractionJukeBox; import com.eu.habbo.habbohotel.items.interactions.InteractionJukeBox;
import com.eu.habbo.habbohotel.items.interactions.InteractionMusicDisc; import com.eu.habbo.habbohotel.items.interactions.InteractionMusicDisc;
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.habbohotel.users.HabboItem;
import com.eu.habbo.messages.outgoing.inventory.AddHabboItemComposer;
import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer;
import com.eu.habbo.messages.outgoing.inventory.RemoveHabboItemComposer;
import com.eu.habbo.messages.outgoing.rooms.items.jukebox.JukeBoxMySongsComposer; import com.eu.habbo.messages.outgoing.rooms.items.jukebox.JukeBoxMySongsComposer;
import com.eu.habbo.messages.outgoing.rooms.items.jukebox.JukeBoxNowPlayingMessageComposer; import com.eu.habbo.messages.outgoing.rooms.items.jukebox.JukeBoxNowPlayingMessageComposer;
import com.eu.habbo.messages.outgoing.rooms.items.jukebox.JukeBoxPlayListComposer; import com.eu.habbo.messages.outgoing.rooms.items.jukebox.JukeBoxPlayListComposer;
@ -18,6 +22,7 @@ import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
public class TraxManager implements Disposable { public class TraxManager implements Disposable {
private final Room room; private final Room room;
@ -38,8 +43,18 @@ public class TraxManager implements Disposable {
statement.setInt(1, this.room.getId()); statement.setInt(1, this.room.getId());
try (ResultSet set = statement.executeQuery()) { try (ResultSet set = statement.executeQuery()) {
while (set.next()) { while (set.next()) {
HabboItem musicDisc = this.room.getHabboItem(set.getInt("item_id")); HabboItem musicDisc = Emulator.getGameEnvironment().getItemManager().loadHabboItem(set.getInt("item_id"));
if (musicDisc instanceof InteractionMusicDisc) {
if (!(musicDisc instanceof InteractionMusicDisc) || musicDisc.getRoomId() != -1) {
try (PreparedStatement stmt = connection.prepareStatement("DELETE FROM room_trax_playlist WHERE room_id = ? AND item_id = ? LIMIT 1")) {
stmt.setInt(1, this.room.getId());
stmt.setInt(2, musicDisc.getId());
stmt.execute();
} catch (SQLException e) {
Emulator.getLogging().logSQLException(e);
return;
}
} else {
SoundTrack track = Emulator.getGameEnvironment().getItemManager().getSoundTrack(((InteractionMusicDisc) musicDisc).getSongId()); SoundTrack track = Emulator.getGameEnvironment().getItemManager().getSoundTrack(((InteractionMusicDisc) musicDisc).getSongId());
if (track != null) { if (track != null) {
@ -128,19 +143,16 @@ public class TraxManager implements Disposable {
return null; return null;
} }
public void addSong(int itemId) { public void addSong(InteractionMusicDisc musicDisc, Habbo habbo) {
HabboItem musicDisc = this.room.getHabboItem(itemId); SoundTrack track = Emulator.getGameEnvironment().getItemManager().getSoundTrack(musicDisc.getSongId());
if (musicDisc instanceof InteractionMusicDisc) {
SoundTrack track = Emulator.getGameEnvironment().getItemManager().getSoundTrack(((InteractionMusicDisc) musicDisc).getSongId());
if (track != null) { if (track != null) {
this.totalLength += track.getLength(); this.totalLength += track.getLength();
this.songs.add((InteractionMusicDisc) musicDisc); this.songs.add(musicDisc);
try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO room_trax_playlist (room_id, item_id) VALUES (?, ?)")) { try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO room_trax_playlist (room_id, item_id) VALUES (?, ?)")) {
statement.setInt(1, this.room.getId()); statement.setInt(1, this.room.getId());
statement.setInt(2, itemId); statement.setInt(2, musicDisc.getId());
statement.execute(); statement.execute();
} catch (SQLException e) { } catch (SQLException e) {
Emulator.getLogging().logSQLException(e); Emulator.getLogging().logSQLException(e);
@ -148,9 +160,15 @@ public class TraxManager implements Disposable {
} }
this.room.sendComposer(new JukeBoxPlayListComposer(this.songs, this.totalLength).compose()); this.room.sendComposer(new JukeBoxPlayListComposer(this.songs, this.totalLength).compose());
this.room.sendComposer(new JukeBoxMySongsComposer(this.myList()).compose());
} musicDisc.setRoomId(-1);
musicDisc.needsUpdate(true);
habbo.getInventory().getItemsComponent().removeHabboItem(musicDisc);
habbo.getClient().sendResponse(new RemoveHabboItemComposer(musicDisc.getGiftAdjustedId()));
} }
this.sendUpdatedSongList();
} }
public void removeSong(int itemId) { public void removeSong(int itemId) {
@ -174,8 +192,34 @@ public class TraxManager implements Disposable {
} }
this.room.sendComposer(new JukeBoxPlayListComposer(this.songs, this.totalLength).compose()); this.room.sendComposer(new JukeBoxPlayListComposer(this.songs, this.totalLength).compose());
musicDisc.setRoomId(0);
musicDisc.needsUpdate(true);
Habbo owner = Emulator.getGameEnvironment().getHabboManager().getHabbo(musicDisc.getUserId());
if (owner != null) {
owner.getInventory().getItemsComponent().addItem(musicDisc);
GameClient client = owner.getClient();
if (client != null) {
client.sendResponse(new AddHabboItemComposer(musicDisc));
client.sendResponse(new InventoryRefreshComposer());
} }
this.room.sendComposer(new JukeBoxMySongsComposer(this.myList()).compose()); }
}
this.sendUpdatedSongList();
}
public void sendUpdatedSongList() {
this.room.getHabbos().forEach(h -> {
GameClient client = h.getClient();
if (client != null) {
client.sendResponse(new JukeBoxMySongsComposer(this.myList(h)));
}
});
} }
public int timePlaying() { public int timePlaying() {
@ -208,21 +252,16 @@ public class TraxManager implements Disposable {
return trax; return trax;
} }
public List<InteractionMusicDisc> myList() { public List<InteractionMusicDisc> myList(Habbo habbo) {
List<InteractionMusicDisc> trax = new ArrayList<>(); return habbo.getInventory().getItemsComponent().getItems().valueCollection().stream()
.filter(i -> i instanceof InteractionMusicDisc && i.getRoomId() == 0)
for (HabboItem item : this.room.getRoomSpecialTypes().getItemsOfType(InteractionMusicDisc.class)) { .map(i -> (InteractionMusicDisc) i)
if (!this.songs.contains(item)) { .collect(Collectors.toList());
trax.add((InteractionMusicDisc) item);
}
}
return trax;
} }
public InteractionMusicDisc fromItemId(int itemId) { public InteractionMusicDisc fromItemId(int itemId) {
for (InteractionMusicDisc musicDisc : this.songs) { for (InteractionMusicDisc musicDisc : this.songs) {
if (musicDisc.getId() == itemId) { if (musicDisc != null && musicDisc.getId() == itemId) {
return musicDisc; return musicDisc;
} }
} }

View File

@ -378,14 +378,14 @@ public class Habbo implements Runnable {
} }
} }
public void mute(int seconds) { public void mute(int seconds, boolean isFlood) {
if (!this.hasPermission("acc_no_mute")) { if (!this.hasPermission("acc_no_mute")) {
int remaining = this.habboStats.addMuteTime(seconds); int remaining = this.habboStats.addMuteTime(seconds);
this.client.sendResponse(new FloodCounterComposer(remaining)); this.client.sendResponse(new FloodCounterComposer(remaining));
this.client.sendResponse(new MutedWhisperComposer(remaining)); this.client.sendResponse(new MutedWhisperComposer(remaining));
Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom();
if (room != null) { if (room != null && !isFlood) {
room.sendComposer(new RoomUserIgnoredComposer(this, RoomUserIgnoredComposer.MUTED).compose()); room.sendComposer(new RoomUserIgnoredComposer(this, RoomUserIgnoredComposer.MUTED).compose());
} }
} }

View File

@ -9,10 +9,8 @@ import com.eu.habbo.habbohotel.items.FurnitureType;
import com.eu.habbo.habbohotel.items.IEventTriggers; import com.eu.habbo.habbohotel.items.IEventTriggers;
import com.eu.habbo.habbohotel.items.Item; import com.eu.habbo.habbohotel.items.Item;
import com.eu.habbo.habbohotel.items.interactions.*; import com.eu.habbo.habbohotel.items.interactions.*;
import com.eu.habbo.habbohotel.rooms.Room; import com.eu.habbo.habbohotel.items.interactions.games.InteractionGameTimer;
import com.eu.habbo.habbohotel.rooms.RoomLayout; import com.eu.habbo.habbohotel.rooms.*;
import com.eu.habbo.habbohotel.rooms.RoomTile;
import com.eu.habbo.habbohotel.rooms.RoomUnit;
import com.eu.habbo.habbohotel.wired.WiredEffectType; import com.eu.habbo.habbohotel.wired.WiredEffectType;
import com.eu.habbo.habbohotel.wired.WiredHandler; import com.eu.habbo.habbohotel.wired.WiredHandler;
import com.eu.habbo.habbohotel.wired.WiredTriggerType; import com.eu.habbo.habbohotel.wired.WiredTriggerType;
@ -20,20 +18,28 @@ import com.eu.habbo.messages.ServerMessage;
import com.eu.habbo.messages.outgoing.rooms.users.RoomUserDanceComposer; import com.eu.habbo.messages.outgoing.rooms.users.RoomUserDanceComposer;
import com.eu.habbo.messages.outgoing.rooms.users.RoomUserDataComposer; import com.eu.habbo.messages.outgoing.rooms.users.RoomUserDataComposer;
import com.eu.habbo.messages.outgoing.users.UpdateUserLookComposer; import com.eu.habbo.messages.outgoing.users.UpdateUserLookComposer;
import com.eu.habbo.util.figure.FigureUtil;
import gnu.trove.set.hash.THashSet; import gnu.trove.set.hash.THashSet;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.math3.util.Pair; import org.apache.commons.math3.util.Pair;
import java.awt.*;
import java.sql.Connection; import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Deque;
import java.util.List; import java.util.List;
public abstract class HabboItem implements Runnable, IEventTriggers { public abstract class HabboItem implements Runnable, IEventTriggers {
private static Class[] TOGGLING_INTERACTIONS = new Class[]{
InteractionGameTimer.class,
InteractionWired.class,
InteractionWiredHighscore.class,
InteractionMultiHeight.class
};
private int id; private int id;
private int userId; private int userId;
private int roomId; private int roomId;
@ -60,7 +66,7 @@ public abstract class HabboItem implements Runnable, IEventTriggers {
this.y = set.getShort("y"); this.y = set.getShort("y");
this.z = set.getDouble("z"); this.z = set.getDouble("z");
this.rotation = set.getInt("rot"); this.rotation = set.getInt("rot");
this.extradata = set.getString("extra_data"); this.extradata = set.getString("extra_data").isEmpty() ? "0" : set.getString("extra_data");
String ltdData = set.getString("limited_data"); String ltdData = set.getString("limited_data");
if (!ltdData.isEmpty()) { if (!ltdData.isEmpty()) {
@ -79,7 +85,7 @@ public abstract class HabboItem implements Runnable, IEventTriggers {
this.y = 0; this.y = 0;
this.z = 0; this.z = 0;
this.rotation = 0; this.rotation = 0;
this.extradata = extradata; this.extradata = extradata.isEmpty() ? "0" : extradata;
this.limitedSells = limitedSells; this.limitedSells = limitedSells;
this.limitedStack = limitedStack; this.limitedStack = limitedStack;
} }
@ -283,10 +289,11 @@ public abstract class HabboItem implements Runnable, IEventTriggers {
} }
} }
if ((this.getBaseItem().getStateCount() > 1 && !(this instanceof InteractionDice)) || Arrays.asList(HabboItem.TOGGLING_INTERACTIONS).contains(this.getClass()) || (objects != null && objects.length == 1 && objects[0].equals("TOGGLE_OVERRIDE"))) {
WiredHandler.handle(WiredTriggerType.STATE_CHANGED, client.getHabbo().getRoomUnit(), room, new Object[]{this}); WiredHandler.handle(WiredTriggerType.STATE_CHANGED, client.getHabbo().getRoomUnit(), room, new Object[]{this});
} }
} }
}
@Override @Override
public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception { public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception {
@ -479,4 +486,30 @@ public abstract class HabboItem implements Runnable, IEventTriggers {
} }
public boolean invalidatesToRoomKick() { return false; } public boolean invalidatesToRoomKick() { return false; }
public List<RoomTile> getOccupyingTiles(RoomLayout layout) {
List<RoomTile> tiles = new ArrayList<>();
Rectangle rect = RoomLayout.getRectangle(this.getX(), this.getY(), this.getBaseItem().getWidth(), this.getBaseItem().getLength(), this.getRotation());
for (int i = rect.x; i < rect.x + rect.getWidth(); i++) {
for (int j = rect.y; j < rect.y + rect.getHeight(); j++) {
tiles.add(layout.getTile((short) i, (short) j));
}
}
return tiles;
}
public RoomTile getOverrideGoalTile(RoomUnit unit, Room room, RoomTile tile) {
return tile;
}
public RoomTileState getOverrideTileState(RoomTile tile, Room room) {
return null;
}
public boolean canOverrideTile(RoomUnit unit, Room room, RoomTile tile) {
return false;
}
} }

View File

@ -4,6 +4,7 @@ import com.eu.habbo.Emulator;
import com.eu.habbo.habbohotel.modtool.ModToolBan; import com.eu.habbo.habbohotel.modtool.ModToolBan;
import com.eu.habbo.habbohotel.permissions.Permission; import com.eu.habbo.habbohotel.permissions.Permission;
import com.eu.habbo.habbohotel.permissions.Rank; import com.eu.habbo.habbohotel.permissions.Rank;
import com.eu.habbo.habbohotel.users.inventory.EffectsComponent;
import com.eu.habbo.messages.ServerMessage; import com.eu.habbo.messages.ServerMessage;
import com.eu.habbo.messages.outgoing.catalog.*; import com.eu.habbo.messages.outgoing.catalog.*;
import com.eu.habbo.messages.outgoing.catalog.marketplace.MarketplaceConfigComposer; import com.eu.habbo.messages.outgoing.catalog.marketplace.MarketplaceConfigComposer;
@ -246,7 +247,9 @@ public class HabboManager {
Rank oldRank = habbo.getHabboInfo().getRank(); Rank oldRank = habbo.getHabboInfo().getRank();
if (!oldRank.getBadge().isEmpty()) { if (!oldRank.getBadge().isEmpty()) {
habbo.deleteBadge(habbo.getInventory().getBadgesComponent().getBadge(oldRank.getBadge())); habbo.deleteBadge(habbo.getInventory().getBadgesComponent().getBadge(oldRank.getBadge()));
//BadgesComponent.deleteBadge(userId, oldRank.getBadge()); // unnecessary as Habbo.deleteBadge does this }
if(oldRank.getRoomEffect() > 0) {
habbo.getInventory().getEffectsComponent().effects.remove(oldRank.getRoomEffect());
} }
habbo.getHabboInfo().setRank(newRank); habbo.getHabboInfo().setRank(newRank);
@ -255,6 +258,10 @@ public class HabboManager {
habbo.addBadge(newRank.getBadge()); habbo.addBadge(newRank.getBadge());
} }
if(newRank.getRoomEffect() > 0) {
habbo.getInventory().getEffectsComponent().createRankEffect(habbo.getHabboInfo().getRank().getRoomEffect());
}
habbo.getClient().sendResponse(new UserPermissionsComposer(habbo)); habbo.getClient().sendResponse(new UserPermissionsComposer(habbo));
habbo.getClient().sendResponse(new UserPerksComposer(habbo)); habbo.getClient().sendResponse(new UserPerksComposer(habbo));

View File

@ -14,12 +14,11 @@ import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
public class EffectsComponent { public class EffectsComponent {
public final THashMap<Integer, HabboEffect> effects; public final THashMap<Integer, HabboEffect> effects = new THashMap<>();
public final Habbo habbo; public final Habbo habbo;
public int activatedEffect = 0; public int activatedEffect = 0;
public EffectsComponent(Habbo habbo) { public EffectsComponent(Habbo habbo) {
this.effects = new THashMap<>();
this.habbo = habbo; this.habbo = habbo;
try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM users_effects WHERE user_id = ?")) { try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM users_effects WHERE user_id = ?")) {
statement.setInt(1, habbo.getHabboInfo().getId()); statement.setInt(1, habbo.getHabboInfo().getId());
@ -31,6 +30,8 @@ public class EffectsComponent {
} catch (SQLException e) { } catch (SQLException e) {
Emulator.getLogging().logSQLException(e); Emulator.getLogging().logSQLException(e);
} }
if(habbo.getHabboInfo().getRank().getRoomEffect() > 0)
this.createRankEffect(habbo.getHabboInfo().getRank().getRoomEffect());
} }
public HabboEffect createEffect(int effectId) { public HabboEffect createEffect(int effectId) {
@ -58,6 +59,17 @@ public class EffectsComponent {
return effect; return effect;
} }
public HabboEffect createRankEffect(int effectId) {
HabboEffect rankEffect = new HabboEffect(effectId, habbo.getHabboInfo().getId());
rankEffect.duration = 0;
rankEffect.isRankEnable = true;
rankEffect.activationTimestamp = Emulator.getIntUnixTimestamp();
rankEffect.enabled = true;
this.effects.put(effectId, rankEffect);
this.activatedEffect = effectId; // enabled by default
return rankEffect;
}
public void addEffect(HabboEffect effect) { public void addEffect(HabboEffect effect) {
this.effects.put(effect.effect, effect); this.effects.put(effect.effect, effect);
@ -67,9 +79,8 @@ public class EffectsComponent {
public void dispose() { public void dispose() {
synchronized (this.effects) { synchronized (this.effects) {
try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE users_effects SET duration = ?, activation_timestamp = ?, total = ? WHERE user_id = ? AND effect = ?")) { try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE users_effects SET duration = ?, activation_timestamp = ?, total = ? WHERE user_id = ? AND effect = ?")) {
this.effects.forEachValue(new TObjectProcedure<HabboEffect>() { this.effects.forEachValue(effect -> {
@Override if(!effect.isRankEnable) {
public boolean execute(HabboEffect effect) {
try { try {
statement.setInt(1, effect.duration); statement.setInt(1, effect.duration);
statement.setInt(2, effect.activationTimestamp); statement.setInt(2, effect.activationTimestamp);
@ -80,9 +91,8 @@ public class EffectsComponent {
} catch (SQLException e) { } catch (SQLException e) {
Emulator.getLogging().logSQLException(e); Emulator.getLogging().logSQLException(e);
} }
return true;
} }
return true;
}); });
statement.executeBatch(); statement.executeBatch();
@ -145,6 +155,7 @@ public class EffectsComponent {
public int activationTimestamp = -1; public int activationTimestamp = -1;
public int total = 1; public int total = 1;
public boolean enabled = false; public boolean enabled = false;
public boolean isRankEnable = false;
public HabboEffect(ResultSet set) throws SQLException { public HabboEffect(ResultSet set) throws SQLException {
this.effect = set.getInt("effect"); this.effect = set.getInt("effect");

View File

@ -139,11 +139,10 @@ public class WiredHandler {
} }
for (InteractionWiredCondition condition : conditions) { for (InteractionWiredCondition condition : conditions) {
if ((condition.operator() == WiredConditionOperator.OR && matchedConditions.contains(condition.getType())) || if (!((condition.operator() == WiredConditionOperator.OR && matchedConditions.contains(condition.getType())) ||
(condition.operator() == WiredConditionOperator.AND && condition.execute(roomUnit, room, stuff))) { (condition.operator() == WiredConditionOperator.AND && condition.execute(roomUnit, room, stuff))) &&
condition.activateBox(room); !Emulator.getPluginManager().fireEvent(new WiredConditionFailedEvent(room, roomUnit, trigger, condition)).isCancelled()) {
} else {
if (!Emulator.getPluginManager().fireEvent(new WiredConditionFailedEvent(room, roomUnit, trigger, condition)).isCancelled())
return false; return false;
} }
} }
@ -194,9 +193,7 @@ public class WiredHandler {
if (effect != null && effect.canExecute(millis)) { if (effect != null && effect.canExecute(millis)) {
executed = true; executed = true;
if (!effect.requiresTriggeringUser() || (roomUnit != null && effect.requiresTriggeringUser())) { if (!effect.requiresTriggeringUser() || (roomUnit != null && effect.requiresTriggeringUser())) {
Emulator.getThreading().run(new Runnable() { Emulator.getThreading().run(() -> {
@Override
public void run() {
if (room.isLoaded()) { if (room.isLoaded()) {
try { try {
if (!effect.execute(roomUnit, room, stuff)) return; if (!effect.execute(roomUnit, room, stuff)) return;
@ -207,7 +204,6 @@ public class WiredHandler {
effect.activateBox(room); effect.activateBox(room);
} }
}
}, effect.getDelay() * 500); }, effect.getDelay() * 500);
} }
} }
@ -415,16 +411,16 @@ public class WiredHandler {
} }
public static void resetTimers(Room room) { public static void resetTimers(Room room) {
if (!room.isLoaded()) if (!room.isLoaded() || room.getRoomSpecialTypes() == null)
return; return;
THashSet<InteractionWiredTrigger> triggers = room.getRoomSpecialTypes().getTriggers(WiredTriggerType.AT_GIVEN_TIME); room.getRoomSpecialTypes().getTriggers().forEach(t -> {
if (t == null) return;
if (triggers != null) { if (t.getType() == WiredTriggerType.AT_GIVEN_TIME || t.getType() == WiredTriggerType.PERIODICALLY || t.getType() == WiredTriggerType.PERIODICALLY_LONG) {
for (InteractionWiredTrigger trigger : triggers) { ((WiredTriggerReset) t).resetTimer();
((WiredTriggerReset) trigger).resetTimer();
}
} }
});
room.setLastTimerReset(Emulator.getIntUnixTimestamp()); room.setLastTimerReset(Emulator.getIntUnixTimestamp());
} }

View File

@ -92,7 +92,7 @@ public class WiredHighscoreManager {
public List<WiredHighscoreRow> getHighscoreRowsForItem(int itemId, WiredHighscoreClearType clearType, WiredHighscoreScoreType scoreType) { public List<WiredHighscoreRow> getHighscoreRowsForItem(int itemId, WiredHighscoreClearType clearType, WiredHighscoreScoreType scoreType) {
if (!this.data.containsKey(itemId)) return null; if (!this.data.containsKey(itemId)) return null;
Stream<WiredHighscoreRow> highscores = this.data.get(itemId).stream() Stream<WiredHighscoreRow> highscores = new ArrayList<>(this.data.get(itemId)).stream()
.filter(entry -> this.timeMatchesEntry(entry, clearType) && (scoreType != WiredHighscoreScoreType.MOSTWIN || entry.isWin())) .filter(entry -> this.timeMatchesEntry(entry, clearType) && (scoreType != WiredHighscoreScoreType.MOSTWIN || entry.isWin()))
.map(entry -> new WiredHighscoreRow( .map(entry -> new WiredHighscoreRow(
entry.getUserIds().stream() entry.getUserIds().stream()

Some files were not shown because too many files have changed in this diff Show More